<html>
<head>
<base href="https://bugs.webkit.org/" />
</head>
<body><span class="vcard"><a class="email" href="mailto:zalan@apple.com" title="zalan <zalan@apple.com>"> <span class="fn">zalan</span></a>
</span> changed
<a class="bz_bug_link
bz_status_NEW "
title="NEW - Soft hyphen is not shown when it is placed at the end of an inline element"
href="https://bugs.webkit.org/show_bug.cgi?id=153980">bug 153980</a>
<br>
<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>What</th>
<th>Removed</th>
<th>Added</th>
</tr>
<tr>
<td style="text-align:right;">Assignee</td>
<td>zalan@apple.com
</td>
<td>webkit-unassigned@lists.webkit.org
</td>
</tr></table>
<p>
<div>
<b><a class="bz_bug_link
bz_status_NEW "
title="NEW - Soft hyphen is not shown when it is placed at the end of an inline element"
href="https://bugs.webkit.org/show_bug.cgi?id=153980#c1">Comment # 1</a>
on <a class="bz_bug_link
bz_status_NEW "
title="NEW - Soft hyphen is not shown when it is placed at the end of an inline element"
href="https://bugs.webkit.org/show_bug.cgi?id=153980">bug 153980</a>
from <span class="vcard"><a class="email" href="mailto:zalan@apple.com" title="zalan <zalan@apple.com>"> <span class="fn">zalan</span></a>
</span></b>
<pre>We missed the case when the character at the breaking position does not fit the line and soft-hyphen is followed by this overflowing character. (foo&shy;bar where b overflows the line). In such cases we don't yet have an item in the breaking history.
This should fix it ->
diff --git a/Source/WebCore/rendering/line/BreakingContext.h b/Source/WebCore/rendering/line/BreakingContext.h
index b44c5a2..46b1c68 100644
--- a/Source/WebCore/rendering/line/BreakingContext.h
+++ b/Source/WebCore/rendering/line/BreakingContext.h
@@ -903,8 +903,28 @@ inline bool BreakingContext::handleText(WordMeasurements& wordMeasurements, bool
m_lineInfo.setPreviousLineBrokeCleanly(true);
wordMeasurement.endOffset = m_lineBreakHistory.offset();
}
- if (m_lineBreakHistory.offset() && downcast<RenderText>(m_lineBreakHistory.renderer()) && downcast<RenderText>(*m_lineBreakHistory.renderer()).textLength() && downcast<RenderText>(*m_lineBreakHistory.renderer()).characterAt(m_lineBreakHistory.offset() - 1) == softHyphen && style.hyphens() != HyphensNone)
- hyphenated = true;
+ // Check if the last breaking position is a soft-hyphen.
+ if (!hyphenated) {
+ const RenderText* textRenderer = nullptr;
+ Optional<int> breakingPositon;
+ if (m_lineBreakHistory.historyLength() && is<RenderText>(m_lineBreakHistory.renderer())) {
+ textRenderer = downcast<RenderText>(m_lineBreakHistory.renderer());
+ breakingPositon = m_lineBreakHistory.offset();
+ } else if (nextBreakablePosition > -1 && is<RenderText>(m_current.renderer())) {
+ textRenderer = downcast<RenderText>(m_current.renderer());
+ breakingPositon = nextBreakablePosition;
+ }
+ if (textRenderer && breakingPositon) {
+ if (breakingPositon.value() == 0) {
+ // We need to check the previous renderer for the soft-hyphen character instead.
+ textRenderer = is<RenderText>(m_lastObject) ? downcast<RenderText>(m_lastObject) : nullptr;
+ if (textRenderer)
+ breakingPositon = textRenderer->textLength();
+ }
+ UChar characterBeforeBreakingPosition = textRenderer->characterAt(breakingPositon.value() - 1);
+ hyphenated = characterBeforeBreakingPosition == softHyphen && style.hyphens() != HyphensNone;
+ }
+ }
if (m_lineBreakHistory.offset() && m_lineBreakHistory.offset() != (unsigned)wordMeasurement.endOffset && !wordMeasurement.width) {
if (charWidth) {
wordMeasurement.endOffset = m_lineBreakHistory.offset();
Patch is coming up soon. (need to see first if checking prev is sufficient enough)</pre>
</div>
</p>
<hr>
<span>You are receiving this mail because:</span>
<ul>
<li>You are the assignee for the bug.</li>
</ul>
</body>
</html>