Commit f4da7568 authored by Koji Ishii's avatar Koji Ishii Committed by Commit Bot

[LayoutNG] Fix 'word-wrap' property when line breaker is rewinding

This patch moves the logic for the 'word-wrap' property from
HandleText() to its lower function, BreakText().

Since HandleOverflow() directly calls BreakText(), this change fixes
the logic to properly kick in not only when scanning forward but
also when rewinding.

fast/text/basic/015.html is rebaselined because its expected image
for the current line breaker breaks at the incorrect position
(the 2nd block breaks after 'i', not after 'u'.)

Bug: 636993
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_layout_ng
Change-Id: I1f3c809411417329420b6af8269b1cceb8796b54
Reviewed-on: https://chromium-review.googlesource.com/672167Reviewed-by: default avatarEmil A Eklund <eae@chromium.org>
Commit-Queue: Koji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/master@{#502853}
parent f9ab1f6b
...@@ -6095,7 +6095,6 @@ crbug.com/591099 fast/text-autosizing/wide-child.html [ Failure ] ...@@ -6095,7 +6095,6 @@ crbug.com/591099 fast/text-autosizing/wide-child.html [ Failure ]
crbug.com/591099 fast/text-autosizing/wide-in-narrow-overflow-scroll.html [ Failure ] crbug.com/591099 fast/text-autosizing/wide-in-narrow-overflow-scroll.html [ Failure ]
crbug.com/591099 fast/text/atomic-inline-before-ellipsis.html [ Failure ] crbug.com/591099 fast/text/atomic-inline-before-ellipsis.html [ Failure ]
crbug.com/591099 fast/text/basic/004.html [ Failure ] crbug.com/591099 fast/text/basic/004.html [ Failure ]
crbug.com/591099 fast/text/basic/015.html [ Failure ]
crbug.com/591099 fast/text/break-word-with-floats.html [ Failure Pass ] crbug.com/591099 fast/text/break-word-with-floats.html [ Failure Pass ]
crbug.com/591099 fast/text/chromium-linux-fontconfig-renderstyle.html [ Failure ] crbug.com/591099 fast/text/chromium-linux-fontconfig-renderstyle.html [ Failure ]
crbug.com/591099 fast/text/complex-text-opacity.html [ Failure ] crbug.com/591099 fast/text/complex-text-opacity.html [ Failure ]
...@@ -6160,7 +6159,6 @@ crbug.com/591099 fast/text/justify-ideograph-vertical.html [ Crash Failure ] ...@@ -6160,7 +6159,6 @@ crbug.com/591099 fast/text/justify-ideograph-vertical.html [ Crash Failure ]
crbug.com/591099 fast/text/large-text-composed-char.html [ Failure Timeout ] crbug.com/591099 fast/text/large-text-composed-char.html [ Failure Timeout ]
crbug.com/591099 fast/text/letter-spacing-leading-and-trailing.html [ Failure ] crbug.com/591099 fast/text/letter-spacing-leading-and-trailing.html [ Failure ]
crbug.com/591099 fast/text/long-word.html [ Failure Timeout ] crbug.com/591099 fast/text/long-word.html [ Failure Timeout ]
crbug.com/591099 fast/text/midword-break-after-breakable-char.html [ Failure ]
crbug.com/591099 fast/text/monospace-width-cache.html [ Failure ] crbug.com/591099 fast/text/monospace-width-cache.html [ Failure ]
crbug.com/591099 fast/text/offsetForPosition-cluster-at-zero.html [ Failure ] crbug.com/591099 fast/text/offsetForPosition-cluster-at-zero.html [ Failure ]
crbug.com/591099 fast/text/offsetForPosition-complex-fallback.html [ Failure ] crbug.com/591099 fast/text/offsetForPosition-complex-fallback.html [ Failure ]
......
...@@ -309,22 +309,9 @@ NGLineBreaker::LineBreakState NGLineBreaker::HandleText( ...@@ -309,22 +309,9 @@ NGLineBreaker::LineBreakState NGLineBreaker::HandleText(
if (auto_wrap_) { if (auto_wrap_) {
// Try to break inside of this text item. // Try to break inside of this text item.
BreakText(item_result, item, available_width - line_.position); BreakText(item_result, item, available_width - line_.position, line_info);
LayoutUnit next_position = line_.position + item_result->inline_size; LayoutUnit next_position = line_.position + item_result->inline_size;
bool is_overflow = next_position > available_width; bool is_overflow = next_position > available_width;
// If overflow and no break opportunities exist, and if 'break-word', try to
// break at every grapheme cluster boundary.
if (is_overflow && break_if_overflow_ &&
IsFirstBreakOpportunity(item_result->end_offset, line_info)) {
DCHECK_EQ(break_iterator_.BreakType(), LineBreakType::kNormal);
break_iterator_.SetBreakType(LineBreakType::kBreakCharacter);
BreakText(item_result, item, available_width - line_.position);
break_iterator_.SetBreakType(LineBreakType::kNormal);
next_position = line_.position + item_result->inline_size;
is_overflow = next_position > available_width;
}
line_.position = next_position; line_.position = next_position;
item_result->no_break_opportunities_inside = is_overflow; item_result->no_break_opportunities_inside = is_overflow;
if (item_result->end_offset < item.EndOffset()) if (item_result->end_offset < item.EndOffset())
...@@ -353,7 +340,7 @@ NGLineBreaker::LineBreakState NGLineBreaker::HandleText( ...@@ -353,7 +340,7 @@ NGLineBreaker::LineBreakState NGLineBreaker::HandleText(
// Because the start position may need to reshape, run ShapingLineBreaker // Because the start position may need to reshape, run ShapingLineBreaker
// with max available width. // with max available width.
DCHECK_NE(offset_, item.StartOffset()); DCHECK_NE(offset_, item.StartOffset());
BreakText(item_result, item, LayoutUnit::Max()); BreakText(item_result, item, LayoutUnit::Max(), line_info);
DCHECK_EQ(item_result->end_offset, item.EndOffset()); DCHECK_EQ(item_result->end_offset, item.EndOffset());
item_result->no_break_opportunities_inside = true; item_result->no_break_opportunities_inside = true;
item_result->prohibit_break_after = true; item_result->prohibit_break_after = true;
...@@ -364,7 +351,8 @@ NGLineBreaker::LineBreakState NGLineBreaker::HandleText( ...@@ -364,7 +351,8 @@ NGLineBreaker::LineBreakState NGLineBreaker::HandleText(
void NGLineBreaker::BreakText(NGInlineItemResult* item_result, void NGLineBreaker::BreakText(NGInlineItemResult* item_result,
const NGInlineItem& item, const NGInlineItem& item,
LayoutUnit available_width) { LayoutUnit available_width,
const NGLineInfo& line_info) {
DCHECK_EQ(item.Type(), NGInlineItem::kText); DCHECK_EQ(item.Type(), NGInlineItem::kText);
item.AssertOffset(item_result->start_offset); item.AssertOffset(item_result->start_offset);
...@@ -389,13 +377,26 @@ void NGLineBreaker::BreakText(NGInlineItemResult* item_result, ...@@ -389,13 +377,26 @@ void NGLineBreaker::BreakText(NGInlineItemResult* item_result,
// overflow. Some details are different, but it's the closest behavior. // overflow. Some details are different, but it's the closest behavior.
item_result->inline_size = available_width; item_result->inline_size = available_width;
DCHECK(!result.is_hyphenated); DCHECK(!result.is_hyphenated);
} else if (result.is_hyphenated) {
AppendHyphen(*item.Style(), shape_result.Get());
item_result->inline_size = shape_result->SnappedWidth();
// TODO(kojii): Implement when adding a hyphen caused overflow.
item_result->text_end_effect = NGTextEndEffect::kHyphen;
} else { } else {
item_result->inline_size = shape_result->SnappedWidth(); item_result->inline_size = shape_result->SnappedWidth();
// If overflow and no break opportunities exist, and if 'word-wrap:
// break-word', try to break at every grapheme cluster boundary.
if (item_result->inline_size > available_width && break_if_overflow_ &&
break_iterator_.BreakType() == LineBreakType::kNormal &&
IsFirstBreakOpportunity(result.break_offset, line_info)) {
break_iterator_.SetBreakType(LineBreakType::kBreakCharacter);
BreakText(item_result, item, available_width, line_info);
break_iterator_.SetBreakType(LineBreakType::kNormal);
return;
}
if (result.is_hyphenated) {
AppendHyphen(*item.Style(), shape_result.Get());
item_result->inline_size = shape_result->SnappedWidth();
// TODO(kojii): Implement when adding a hyphen caused overflow.
item_result->text_end_effect = NGTextEndEffect::kHyphen;
}
} }
item_result->end_offset = result.break_offset; item_result->end_offset = result.break_offset;
item_result->shape_result = std::move(shape_result); item_result->shape_result = std::move(shape_result);
...@@ -721,7 +722,7 @@ void NGLineBreaker::HandleOverflow(NGLineInfo* line_info) { ...@@ -721,7 +722,7 @@ void NGLineBreaker::HandleOverflow(NGLineInfo* line_info) {
LayoutUnit item_available_width = LayoutUnit item_available_width =
std::min(-next_width_to_rewind, item_result->inline_size - 1); std::min(-next_width_to_rewind, item_result->inline_size - 1);
SetCurrentStyle(*item.Style()); SetCurrentStyle(*item.Style());
BreakText(item_result, item, item_available_width); BreakText(item_result, item, item_available_width, *line_info);
if (item_result->inline_size <= item_available_width) { if (item_result->inline_size <= item_available_width) {
DCHECK(item_result->end_offset < item.EndOffset() || DCHECK(item_result->end_offset < item.EndOffset() ||
(item_result->end_offset == item.EndOffset() && (item_result->end_offset == item.EndOffset() &&
......
...@@ -106,7 +106,8 @@ class CORE_EXPORT NGLineBreaker { ...@@ -106,7 +106,8 @@ class CORE_EXPORT NGLineBreaker {
NGInlineItemResult*); NGInlineItemResult*);
void BreakText(NGInlineItemResult*, void BreakText(NGInlineItemResult*,
const NGInlineItem&, const NGInlineItem&,
LayoutUnit available_width); LayoutUnit available_width,
const NGLineInfo&);
static void AppendHyphen(const ComputedStyle&, ShapeResult*); static void AppendHyphen(const ComputedStyle&, ShapeResult*);
LineBreakState HandleControlItem(const NGInlineItem&, NGInlineItemResult*); LineBreakState HandleControlItem(const NGInlineItem&, NGInlineItemResult*);
......
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