<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[284744] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/284744">284744</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2021-10-23 08:54:06 -0700 (Sat, 23 Oct 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[LFC][IFC] Breaking before hyphen is only allowed when line-break is loose
https://bugs.webkit.org/show_bug.cgi?id=232191

Reviewed by Antti Koivisto.

Source/WebCore:

This is in preparation for enabling the fix for webkit.org/b/232192.

Two hyphenation related WPT tests (line-break-normal-hyphens-002.html, line-break-strict-hyphens-002.html)
simply pass because of a LayoutUnit (block width) vs. float (measured text width) precision mismatching bug.
This precision issue makes the line breaking code believe that fewer characters fit the line
producing the expected results for those two tests.
Let's fix the line breaking logic first by adding "breaks before hyphens" rules,
so that when webkit.org/b/232192 is addressed, we won't be seeing any WPT regressions.

* layout/formattingContexts/inline/InlineContentBreaker.cpp:
(WebCore::Layout::midWordBreak):

Source/WTF:

* wtf/unicode/CharacterNames.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfunicodeCharacterNamesh">trunk/Source/WTF/wtf/unicode/CharacterNames.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorelayoutformattingContextsinlineInlineContentBreakercpp">trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (284743 => 284744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog       2021-10-23 15:21:16 UTC (rev 284743)
+++ trunk/Source/WTF/ChangeLog  2021-10-23 15:54:06 UTC (rev 284744)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2021-10-23  Alan Bujtas  <zalan@apple.com>
+
+        [LFC][IFC] Breaking before hyphen is only allowed when line-break is loose
+        https://bugs.webkit.org/show_bug.cgi?id=232191
+
+        Reviewed by Antti Koivisto.
+
+        * wtf/unicode/CharacterNames.h:
+
</ins><span class="cx"> 2021-10-23  Chris Fleizach  <cfleizach@apple.com>
</span><span class="cx"> 
</span><span class="cx">         AX: Unify speech synthesizer platform usage for Mac/iOS
</span></span></pre></div>
<a id="trunkSourceWTFwtfunicodeCharacterNamesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/unicode/CharacterNames.h (284743 => 284744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/unicode/CharacterNames.h    2021-10-23 15:21:16 UTC (rev 284743)
+++ trunk/Source/WTF/wtf/unicode/CharacterNames.h       2021-10-23 15:54:06 UTC (rev 284744)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx"> constexpr UChar hebrewPunctuationGershayim = 0x05F4;
</span><span class="cx"> constexpr UChar horizontalEllipsis = 0x2026;
</span><span class="cx"> constexpr UChar hyphen = 0x2010;
</span><ins>+constexpr UChar endash = 0x2013;
</ins><span class="cx"> constexpr UChar hyphenMinus = 0x002D;
</span><span class="cx"> constexpr UChar ideographicComma = 0x3001;
</span><span class="cx"> constexpr UChar ideographicFullStop = 0x3002;
</span><span class="lines">@@ -141,6 +142,7 @@
</span><span class="cx"> using WTF::Unicode::hebrewPunctuationGershayim;
</span><span class="cx"> using WTF::Unicode::horizontalEllipsis;
</span><span class="cx"> using WTF::Unicode::hyphen;
</span><ins>+using WTF::Unicode::endash;
</ins><span class="cx"> using WTF::Unicode::hyphenMinus;
</span><span class="cx"> using WTF::Unicode::ideographicComma;
</span><span class="cx"> using WTF::Unicode::ideographicFullStop;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (284743 => 284744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-10-23 15:21:16 UTC (rev 284743)
+++ trunk/Source/WebCore/ChangeLog      2021-10-23 15:54:06 UTC (rev 284744)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2021-10-23  Alan Bujtas  <zalan@apple.com>
+
+        [LFC][IFC] Breaking before hyphen is only allowed when line-break is loose
+        https://bugs.webkit.org/show_bug.cgi?id=232191
+
+        Reviewed by Antti Koivisto.
+
+        This is in preparation for enabling the fix for webkit.org/b/232192.
+
+        Two hyphenation related WPT tests (line-break-normal-hyphens-002.html, line-break-strict-hyphens-002.html)
+        simply pass because of a LayoutUnit (block width) vs. float (measured text width) precision mismatching bug.
+        This precision issue makes the line breaking code believe that fewer characters fit the line
+        producing the expected results for those two tests.
+        Let's fix the line breaking logic first by adding "breaks before hyphens" rules,
+        so that when webkit.org/b/232192 is addressed, we won't be seeing any WPT regressions.
+
+        * layout/formattingContexts/inline/InlineContentBreaker.cpp:
+        (WebCore::Layout::midWordBreak):
+
</ins><span class="cx"> 2021-10-23  David Kilzer  <ddkilzer@apple.com>
</span><span class="cx"> 
</span><span class="cx">         WebAVPlayerController should use WeakPtr<> for C++ instance variables
</span></span></pre></div>
<a id="trunkSourceWebCorelayoutformattingContextsinlineInlineContentBreakercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp (284743 => 284744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp   2021-10-23 15:21:16 UTC (rev 284743)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp      2021-10-23 15:54:06 UTC (rev 284744)
</span><span class="lines">@@ -306,13 +306,14 @@
</span><span class="cx"> {
</span><span class="cx">     auto& inlineTextItem = downcast<InlineTextItem>(textRun.inlineItem);
</span><span class="cx">     auto& style = textRun.style;
</span><del>-    ASSERT(style.lineBreak() == LineBreak::Anywhere || style.wordBreak() == WordBreak::BreakAll || style.wordBreak() == WordBreak::BreakWord || style.overflowWrap() == OverflowWrap::BreakWord || style.overflowWrap() == OverflowWrap::Anywhere);
</del><ins>+    auto lineBreak = style.lineBreak();
+    ASSERT(lineBreak == LineBreak::Anywhere || style.wordBreak() == WordBreak::BreakAll || style.wordBreak() == WordBreak::BreakWord || style.overflowWrap() == OverflowWrap::BreakWord || style.overflowWrap() == OverflowWrap::Anywhere);
</ins><span class="cx"> 
</span><span class="cx">     auto midWordBreak = TextUtil::midWordBreak(inlineTextItem, style.fontCascade(), textRun.logicalWidth, availableWidth, runLogicalLeft);
</span><span class="cx">     if (!midWordBreak.length || midWordBreak.length == inlineTextItem.length())
</span><span class="cx">         return midWordBreak;
</span><span class="cx"> 
</span><del>-    auto canBreakBetweenAnyTypographicCharacterUnit = style.lineBreak() == LineBreak::Anywhere || style.wordBreak() == WordBreak::BreakWord || style.overflowWrap() == OverflowWrap::BreakWord || style.overflowWrap() == OverflowWrap::Anywhere;
</del><ins>+    auto canBreakBetweenAnyTypographicCharacterUnit = lineBreak == LineBreak::Anywhere || style.wordBreak() == WordBreak::BreakWord || style.overflowWrap() == OverflowWrap::BreakWord || style.overflowWrap() == OverflowWrap::Anywhere;
</ins><span class="cx">     if (canBreakBetweenAnyTypographicCharacterUnit)
</span><span class="cx">         return midWordBreak;
</span><span class="cx"> 
</span><span class="lines">@@ -321,10 +322,18 @@
</span><span class="cx">     const auto left = midWordBreak.start;
</span><span class="cx">     auto right = left + midWordBreak.length;
</span><span class="cx">     for (; right > left; --right) {
</span><del>-        auto isBreakable = [](auto character) {
</del><ins>+        auto canBreakBefore = [&](auto character) {
</ins><span class="cx">             // FIXME: This should include all the cases from https://unicode.org/reports/tr14
</span><span class="cx">             // Use a breaking matrix similar to lineBreakTable in BreakLines.cpp
</span><span class="cx">             // Also see kBreakAllLineBreakClassTable in third_party/blink/renderer/platform/text/text_break_iterator.cc
</span><ins>+            if (lineBreak != LineBreak::Loose) {
+                // The following breaks are allowed for loose line breaking if the preceding character belongs to the Unicode
+                // line breaking class ID, and are otherwise forbidden:
+                // ‐ U+2010, – U+2013
+                // https://drafts.csswg.org/css-text/#line-break-property
+                if (character == hyphen || character == endash)
+                    return false;
+            }
</ins><span class="cx">             if (character == noBreakSpace)
</span><span class="cx">                 return false;
</span><span class="cx">             auto isPunctuation = U_GET_GC_MASK(character) & (U_GC_PS_MASK | U_GC_PE_MASK | U_GC_PI_MASK | U_GC_PF_MASK | U_GC_PO_MASK);
</span><span class="lines">@@ -331,7 +340,7 @@
</span><span class="cx">             return character == reverseSolidus || !isPunctuation;
</span><span class="cx">         };
</span><span class="cx">         U16_SET_CP_START(text, left, right);
</span><del>-        if (isBreakable(text[right]))
</del><ins>+        if (canBreakBefore(text[right]))
</ins><span class="cx">             break;
</span><span class="cx">     }
</span><span class="cx">     RELEASE_ASSERT(right >= left);
</span></span></pre>
</div>
</div>

</body>
</html>