Simple line layout: Add support for -webkit-hyphenate-limit-after and -webkit-hyphena...
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Jan 2017 19:36:27 +0000 (19:36 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Jan 2017 19:36:27 +0000 (19:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=167439
<rdar://problem/30180184>

Reviewed by Antti Koivisto.

Source/WebCore:

Implement pre and post hyphen length constrains for simple line layout.

Tests: fast/text/simple-line-layout-hyphen-limit-after.html
       fast/text/simple-line-layout-hyphen-limit-before.html

* rendering/SimpleLineLayout.cpp:
(WebCore::SimpleLineLayout::canUseForStyle):
(WebCore::SimpleLineLayout::printReason):
* rendering/SimpleLineLayoutTextFragmentIterator.cpp:
(WebCore::SimpleLineLayout::TextFragmentIterator::Style::Style): Same as normal line layout default values.
(WebCore::SimpleLineLayout::TextFragmentIterator::lastHyphenPosition):
* rendering/SimpleLineLayoutTextFragmentIterator.h:

LayoutTests:

* fast/text/simple-line-layout-hyphen-limit-after.html: Added.
* fast/text/simple-line-layout-hyphen-limit-before-expected.html: Added.
* fast/text/simple-line-layout-hyphen-limit-before.html: Added.
* platform/mac/fast/text/hyphenate-limit-before-after-expected.txt: progression.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@211222 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/text/simple-line-layout-hyphen-limit-after-expected.html [new file with mode: 0644]
LayoutTests/fast/text/simple-line-layout-hyphen-limit-after.html [new file with mode: 0644]
LayoutTests/fast/text/simple-line-layout-hyphen-limit-before-expected.html [new file with mode: 0644]
LayoutTests/fast/text/simple-line-layout-hyphen-limit-before.html [new file with mode: 0644]
LayoutTests/platform/mac/fast/text/hyphenate-limit-before-after-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/rendering/SimpleLineLayout.cpp
Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp
Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.h

index 244bb14..299ff53 100644 (file)
@@ -1,3 +1,16 @@
+2017-01-26  Zalan Bujtas  <zalan@apple.com>
+
+        Simple line layout: Add support for -webkit-hyphenate-limit-after and -webkit-hyphenate-limit-before
+        https://bugs.webkit.org/show_bug.cgi?id=167439
+        <rdar://problem/30180184>
+
+        Reviewed by Antti Koivisto.
+
+        * fast/text/simple-line-layout-hyphen-limit-after.html: Added.
+        * fast/text/simple-line-layout-hyphen-limit-before-expected.html: Added.
+        * fast/text/simple-line-layout-hyphen-limit-before.html: Added.
+        * platform/mac/fast/text/hyphenate-limit-before-after-expected.txt: progression.
+
 2017-01-26  Ryan Haddad  <ryanhaddad@apple.com>
 
         Marking swipe/main-frame-pinning-requirement.html as flaky on El Capitan.
diff --git a/LayoutTests/fast/text/simple-line-layout-hyphen-limit-after-expected.html b/LayoutTests/fast/text/simple-line-layout-hyphen-limit-after-expected.html
new file mode 100644 (file)
index 0000000..85dd5a6
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>This tests that simple and normal line layout produce the same lines with hyphenate-limit-after</title>
+<style>
+div {
+  display: inline-block;
+  -webkit-hyphens: auto;
+  width: 50px;
+  border: 1px solid green;
+  margin-right: 50px;
+  vertical-align: top;
+}
+</style>
+<script>
+if (internal.settings)
+    internals.settings.setSimpleLineLayoutEnabled(false);
+</script>
+</head>
+<body>
+<div style="-webkit-hyphenate-limit-after: 1;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 2;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 3;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 4;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 5;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 6;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 7;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 8;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+</body>
+</html>
diff --git a/LayoutTests/fast/text/simple-line-layout-hyphen-limit-after.html b/LayoutTests/fast/text/simple-line-layout-hyphen-limit-after.html
new file mode 100644 (file)
index 0000000..97d39b1
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>This tests that simple and normal line layout produce the same lines with hyphenate-limit-after</title>
+<style>
+div {
+  display: inline-block;
+  -webkit-hyphens: auto;
+  width: 50px;
+  border: 1px solid green;
+  margin-right: 50px;
+  vertical-align: top;
+}
+</style>
+</head>
+<body>
+<div style="-webkit-hyphenate-limit-after: 1;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 2;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 3;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 4;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 5;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 6;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 7;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-after: 8;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+</body>
+</html>
diff --git a/LayoutTests/fast/text/simple-line-layout-hyphen-limit-before-expected.html b/LayoutTests/fast/text/simple-line-layout-hyphen-limit-before-expected.html
new file mode 100644 (file)
index 0000000..64b1d73
--- /dev/null
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>This tests that simple and normal line layout produce the same lines with hyphenate-limit-before</title>
+<style>
+div {
+  display: inline-block;
+  -webkit-hyphens: auto;
+  width: 50px;
+  border: 1px solid green;
+  margin-right: 50px;
+  vertical-align: top;
+}
+</style>
+<script>
+if (internal.settings)
+    internals.settings.setSimpleLineLayoutEnabled(false);
+</script>
+</head>
+<body>
+<div style="-webkit-hyphenate-limit-before: 0;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 1;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 2;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 3;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 4;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 5;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 6;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 7;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+</body>
+</html>
diff --git a/LayoutTests/fast/text/simple-line-layout-hyphen-limit-before.html b/LayoutTests/fast/text/simple-line-layout-hyphen-limit-before.html
new file mode 100644 (file)
index 0000000..45c3106
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>This tests that simple and normal line layout produce the same lines with hyphenate-limit-before</title>
+<style>
+div {
+  display: inline-block;
+  -webkit-hyphens: auto;
+  width: 50px;
+  border: 1px solid green;
+  margin-right: 50px;
+  vertical-align: top;
+}
+</style>
+</head>
+<body>
+<div style="-webkit-hyphenate-limit-before: 0;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 1;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 2;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 3;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 4;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 5;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 6;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+<div style="-webkit-hyphenate-limit-before: 7;">accoutrements accessories anomalistic auspicious favorable prosperous circumlocution conviviality coruscant cuddlesome cynosure equanimity excogitate gasconading idiosyncratic luminescent magnanimous nidificate penultimate perfidiousness perspicacious proficuous profitable advantageous remunerative profitability saxicolous sesquipedalian superabundant unencumbered responsibilities unparagoned peerless</div>
+</body>
+</html>
index 06d8b26..57c0fe4 100644 (file)
@@ -53,15 +53,15 @@ layer at (0,0) size 800x600
       RenderText {#text} at (434,123) size 4x18
         text run at (434,123) width 4: " "
       RenderBlock {DIV} at (446,84) size 126x60 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 74x54
+        RenderText {#text} at (3,3) size 89x54
           text run at (3,3) width 74: "There is re" + hyphen string "-"
-          text run at (3,21) width 60: "markable"
-          text run at (3,39) width 61: "evidence."
+          text run at (3,21) width 89: "markable evi" + hyphen string "-"
+          text run at (3,39) width 42: "dence."
       RenderText {#text} at (580,123) size 4x18
         text run at (580,123) width 4: " "
       RenderBlock {DIV} at (592,84) size 126x60 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 72x54
+        RenderText {#text} at (3,3) size 101x54
           text run at (3,3) width 52: "There is"
-          text run at (3,21) width 72: "remarkable"
-          text run at (3,39) width 61: "evidence."
+          text run at (3,21) width 101: "remarkable evi" + hyphen string "-"
+          text run at (3,39) width 42: "dence."
       RenderText {#text} at (0,0) size 0x0
index f504c34..5a48a45 100644 (file)
@@ -1,3 +1,24 @@
+2017-01-26  Zalan Bujtas  <zalan@apple.com>
+
+        Simple line layout: Add support for -webkit-hyphenate-limit-after and -webkit-hyphenate-limit-before
+        https://bugs.webkit.org/show_bug.cgi?id=167439
+        <rdar://problem/30180184>
+
+        Reviewed by Antti Koivisto.
+
+        Implement pre and post hyphen length constrains for simple line layout.
+
+        Tests: fast/text/simple-line-layout-hyphen-limit-after.html
+               fast/text/simple-line-layout-hyphen-limit-before.html
+
+        * rendering/SimpleLineLayout.cpp:
+        (WebCore::SimpleLineLayout::canUseForStyle):
+        (WebCore::SimpleLineLayout::printReason):
+        * rendering/SimpleLineLayoutTextFragmentIterator.cpp:
+        (WebCore::SimpleLineLayout::TextFragmentIterator::Style::Style): Same as normal line layout default values.
+        (WebCore::SimpleLineLayout::TextFragmentIterator::lastHyphenPosition):
+        * rendering/SimpleLineLayoutTextFragmentIterator.h:
+
 2017-01-26  Brady Eidson  <beidson@apple.com>
 
         Gamepad support shows wrong values for PS4 controllers (D-pad is missing).
index 749cb98..a1dc70c 100644 (file)
@@ -86,7 +86,7 @@ enum AvoidanceReason_ : uint64_t {
     FlowHasRTLOrdering                    = 1LLU  << 20,
     FlowHasLineAlignEdges                 = 1LLU  << 21,
     FlowHasLineSnap                       = 1LLU  << 22,
-    FlowHasHypensLimit                    = 1LLU  << 23,
+    FlowHasHypensLineLimit                = 1LLU  << 23,
     FlowHasTextEmphasisFillOrMark         = 1LLU  << 24,
     FlowHasTextShadow                     = 1LLU  << 25,
     FlowHasPseudoFirstLine                = 1LLU  << 26,
@@ -237,10 +237,8 @@ static AvoidanceReasonFlags canUseForStyle(const RenderStyle& style, IncludeReas
         SET_REASON_AND_RETURN_IF_NEEDED(FlowHasLineAlignEdges, reasons, includeReasons);
     if (style.lineSnap() != LineSnapNone)
         SET_REASON_AND_RETURN_IF_NEEDED(FlowHasLineSnap, reasons, includeReasons);
-    if (style.hyphenationLimitBefore() != RenderStyle::initialHyphenationLimitBefore()
-        || style.hyphenationLimitAfter() != RenderStyle::initialHyphenationLimitAfter()
-        || style.hyphenationLimitLines() != RenderStyle::initialHyphenationLimitLines())
-        SET_REASON_AND_RETURN_IF_NEEDED(FlowHasHypensLimit, reasons, includeReasons);
+    if (style.hyphenationLimitLines() != RenderStyle::initialHyphenationLimitLines())
+        SET_REASON_AND_RETURN_IF_NEEDED(FlowHasHypensLineLimit, reasons, includeReasons);
     if (style.textEmphasisFill() != TextEmphasisFillFilled || style.textEmphasisMark() != TextEmphasisMarkNone)
         SET_REASON_AND_RETURN_IF_NEEDED(FlowHasTextEmphasisFillOrMark, reasons, includeReasons);
     if (style.textShadow())
@@ -991,8 +989,8 @@ static void printReason(AvoidanceReason reason, TextStream& stream)
     case FlowHasLineSnap:
         stream << "-webkit-line-snap property";
         break;
-    case FlowHasHypensLimit:
-        stream << "hyphen-limit-* property";
+    case FlowHasHypensLineLimit:
+        stream << "-webkit-hyphenate-limit-lines property";
         break;
     case FlowHasTextEmphasisFillOrMark:
         stream << "text-emphasis (fill/mark)";
index a6d5e72..3294b46 100644 (file)
@@ -49,6 +49,8 @@ TextFragmentIterator::Style::Style(const RenderStyle& style)
     , tabWidth(collapseWhitespace ? 0 : style.tabSize())
     , shouldHyphenate(style.hyphens() == HyphensAuto && canHyphenate(style.locale()))
     , hyphenStringWidth(shouldHyphenate ? font.width(TextRun(style.hyphenString())) : 0)
+    , hyphenLimitBefore(style.hyphenationLimitBefore() < 0 ? 2 : style.hyphenationLimitBefore())
+    , hyphenLimitAfter(style.hyphenationLimitAfter() < 0 ? 2 : style.hyphenationLimitAfter())
     , locale(style.locale())
 {
 }
@@ -176,20 +178,28 @@ float TextFragmentIterator::textWidth(unsigned from, unsigned to, float xPositio
     return runWidth(segment, from, to, xPosition);
 }
 
-std::optional<unsigned> TextFragmentIterator::lastHyphenPosition(const TextFragmentIterator::TextFragment& run, unsigned beforeIndex) const
+std::optional<unsigned> TextFragmentIterator::lastHyphenPosition(const TextFragmentIterator::TextFragment& run, unsigned before) const
 {
-    ASSERT(run.start() < beforeIndex);
+    ASSERT(run.start() < before);
     auto& segment = *m_currentSegment;
-    ASSERT(segment.start <= beforeIndex && beforeIndex <= segment.end);
+    ASSERT(segment.start <= before && before <= segment.end);
     ASSERT(is<RenderText>(segment.renderer));
     if (!m_style.shouldHyphenate || run.type() != TextFragment::NonWhitespace)
         return std::nullopt;
-    
+    // Check if there are enough characters in the run.
+    unsigned runLength = run.end() - run.start();
+    if (m_style.hyphenLimitBefore >= runLength || m_style.hyphenLimitAfter >= runLength || m_style.hyphenLimitBefore + m_style.hyphenLimitAfter > runLength)
+        return std::nullopt;
     auto runStart = segment.toSegmentPosition(run.start());
-    auto before = segment.toSegmentPosition(beforeIndex) - runStart;
+    auto beforeIndex = segment.toSegmentPosition(before) - runStart;
+    if (beforeIndex <= m_style.hyphenLimitBefore)
+        return std::nullopt;
+    // Adjust before index to accommodate the limit-after value (this is the last potential hyphen location).
+    beforeIndex = std::min(beforeIndex, runLength - m_style.hyphenLimitAfter + 1);
     auto substringForHyphenation = StringView(segment.text).substring(runStart, run.end() - run.start());
-    auto hyphenLocation = lastHyphenLocation(substringForHyphenation, before, m_style.locale);
-    if (hyphenLocation)
+    auto hyphenLocation = lastHyphenLocation(substringForHyphenation, beforeIndex, m_style.locale);
+    // Check if there are enough characters before and after the hyphen.
+    if (hyphenLocation && hyphenLocation >= m_style.hyphenLimitBefore && m_style.hyphenLimitAfter <= (runLength - hyphenLocation))
         return segment.toRenderPosition(hyphenLocation + runStart);
     return std::nullopt;
 }
index ad78499..cd3cdb6 100644 (file)
@@ -118,6 +118,8 @@ public:
         unsigned tabWidth;
         bool shouldHyphenate;
         float hyphenStringWidth;
+        unsigned hyphenLimitBefore;
+        unsigned hyphenLimitAfter;
         AtomicString locale;
     };
     const Style& style() const { return m_style; }