Title: [246066] trunk/Source/WebCore
Revision
246066
Author
[email protected]
Date
2019-06-04 08:49:56 -0700 (Tue, 04 Jun 2019)

Log Message

[LFC][IFC] Add hard line break handling to LineBreaker
https://bugs.webkit.org/show_bug.cgi?id=198503
<rdar://problem/51373482>

Reviewed by Antti Koivisto.

LineBreaker should simply return BreakingContext::Keep with the breaking opportunity of yes.

* layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
(WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
* layout/inlineformatting/InlineLineBreaker.cpp:
(WebCore::Layout::LineBreaker::breakingContext):
(WebCore::Layout::LineBreaker::wordBreakingBehavior const):
(WebCore::Layout::LineBreaker::isAtBreakingOpportunity):
* layout/inlineformatting/InlineLineBreaker.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (246065 => 246066)


--- trunk/Source/WebCore/ChangeLog	2019-06-04 15:48:04 UTC (rev 246065)
+++ trunk/Source/WebCore/ChangeLog	2019-06-04 15:49:56 UTC (rev 246066)
@@ -1,5 +1,23 @@
 2019-06-04  Zalan Bujtas  <[email protected]>
 
+        [LFC][IFC] Add hard line break handling to LineBreaker
+        https://bugs.webkit.org/show_bug.cgi?id=198503
+        <rdar://problem/51373482>
+
+        Reviewed by Antti Koivisto.
+
+        LineBreaker should simply return BreakingContext::Keep with the breaking opportunity of yes.
+
+        * layout/inlineformatting/InlineFormattingContextLineLayout.cpp:
+        (WebCore::Layout::InlineFormattingContext::LineLayout::placeInlineItems const):
+        * layout/inlineformatting/InlineLineBreaker.cpp:
+        (WebCore::Layout::LineBreaker::breakingContext):
+        (WebCore::Layout::LineBreaker::wordBreakingBehavior const):
+        (WebCore::Layout::LineBreaker::isAtBreakingOpportunity):
+        * layout/inlineformatting/InlineLineBreaker.h:
+
+2019-06-04  Zalan Bujtas  <[email protected]>
+
         [LFC][IFC] Remove InlineItem::width
         https://bugs.webkit.org/show_bug.cgi?id=198502
         <rdar://problem/51371744>

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp (246065 => 246066)


--- trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-04 15:48:04 UTC (rev 246065)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextLineLayout.cpp	2019-06-04 15:49:56 UTC (rev 246066)
@@ -214,11 +214,6 @@
         auto& inlineItem = lineInput.inlineItems[inlineItemIndex];
         auto inlineItemWidth = WebCore::Layout::inlineItemWidth(layoutState(), *inlineItem, currentLogicalRight);
 
-        if (inlineItem->isHardLineBreak()) {
-            uncommittedContent.add(*inlineItem, inlineItemWidth);
-            commitPendingContent();
-            return closeLine();
-        }
         // FIXME: Ensure LineContext::trimmableWidth includes uncommitted content if needed.
         auto breakingContext = lineBreaker.breakingContext(*inlineItem, inlineItemWidth, { availableWidth, currentLogicalRight, line->trailingTrimmableWidth(), !line->hasContent() });
         if (breakingContext.isAtBreakingOpportunity)
@@ -229,7 +224,7 @@
             return closeLine();
 
         // Partial content stays on the current line. 
-        if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Break) {
+        if (breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Split) {
             ASSERT(inlineItem->isText());
 
             ASSERT_NOT_IMPLEMENTED_YET();
@@ -236,11 +231,17 @@
             return closeLine();
         }
 
+        ASSERT(breakingContext.breakingBehavior == LineBreaker::BreakingBehavior::Keep);
         if (inlineItem->isFloat()) {
             handleFloat(*line, floatingContext, *inlineItem);
             ++committedInlineItemCount;
             continue;
         }
+        if (inlineItem->isHardLineBreak()) {
+            uncommittedContent.add(*inlineItem, inlineItemWidth);
+            commitPendingContent();
+            return closeLine();
+        }
 
         uncommittedContent.add(*inlineItem, inlineItemWidth);
         if (breakingContext.isAtBreakingOpportunity)

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp (246065 => 246066)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp	2019-06-04 15:48:04 UTC (rev 246065)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.cpp	2019-06-04 15:49:56 UTC (rev 246066)
@@ -40,6 +40,9 @@
     if (lineContext.isEmpty || logicalWidth <= lineContext.availableWidth)
         return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) };
 
+    if (inlineItem.isHardLineBreak())
+        return { BreakingBehavior::Keep, isAtBreakingOpportunity(inlineItem) };
+
     if (is<InlineTextItem>(inlineItem))
         return { wordBreakingBehavior(downcast<InlineTextItem>(inlineItem), lineContext.isEmpty), isAtBreakingOpportunity(inlineItem) };
 
@@ -62,20 +65,20 @@
     auto& style = inlineItem.style();
 
     if (inlineItem.isWhitespace())
-        return style.collapseWhiteSpace() ? BreakingBehavior::Wrap : BreakingBehavior::Break;
+        return style.collapseWhiteSpace() ? BreakingBehavior::Wrap : BreakingBehavior::Split;
 
     auto shouldHypenate = !m_hyphenationIsDisabled && style.hyphens() == Hyphens::Auto && canHyphenate(style.locale());
     if (shouldHypenate)
-        return BreakingBehavior::Break;
+        return BreakingBehavior::Split;
 
     if (style.autoWrap()) {
         // Break any word
         if (style.wordBreak() == WordBreak::BreakAll)
-            return BreakingBehavior::Break;
+            return BreakingBehavior::Split;
 
         // Break first run on line.
         if (lineIsEmpty && style.breakWords() && style.preserveNewline())
-            return BreakingBehavior::Break;
+            return BreakingBehavior::Split;
     }
 
     // Non-breakable non-whitespace run.
@@ -84,6 +87,9 @@
 
 bool LineBreaker::isAtBreakingOpportunity(const InlineItem& inlineItem)
 {
+    if (inlineItem.isHardLineBreak())
+        return true;
+
     if (is<InlineTextItem>(inlineItem))
         return downcast<InlineTextItem>(inlineItem).isWhitespace();
     return !inlineItem.isFloat() && !inlineItem.isContainerStart() && !inlineItem.isContainerEnd();

Modified: trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h (246065 => 246066)


--- trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h	2019-06-04 15:48:04 UTC (rev 246065)
+++ trunk/Source/WebCore/layout/inlineformatting/InlineLineBreaker.h	2019-06-04 15:49:56 UTC (rev 246066)
@@ -34,7 +34,7 @@
 
 class LineBreaker {
 public:
-    enum class BreakingBehavior { Keep, Break, Wrap };
+    enum class BreakingBehavior { Keep, Split, Wrap };
     struct BreakingContext {
         BreakingBehavior breakingBehavior;
         bool isAtBreakingOpportunity { false };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to