[LFC][IFC] Introduce InlineItem::nonBreakableStart/End
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Nov 2018 15:52:28 +0000 (15:52 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Nov 2018 15:52:28 +0000 (15:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=191839

Reviewed by Antti Koivisto.

Non-breakable start/end marks margin/padding/border space (even when it does not directly come from the associated layout box)

<span style="padding: 5px"><span>nested content with padding parent</span</span>
<nested content with padding parent> <- inline run has 5px non-breakable start/end.

<span style="border: 5px solid green"><span style="padding-right: 10px; margin-right: 1px">1</span>2</span><span>    3</span>
<1> <- inline run has 5px non-breakable start and 11px non-breakable end.
<2> <- inline run has 0px non-breakable start and 5px non-breakable end.
<3> <- no non-breakable values.

This is what the runs look like (input to line breaking)
<     1           2     >
< > (whitespace)
<3>
The line breaking treats the paddding/border etc space as part of the run and as non-breaking opportunity.
With the given runs the first position where we can break the line is at the whitespace.

* layout/inlineformatting/InlineFormattingContext.cpp:
(WebCore::Layout::InlineFormattingContext::collectInlineContentForSubtree const):
* layout/inlineformatting/InlineItem.h:
(WebCore::Layout::InlineItem::nonBreakableStart const):
(WebCore::Layout::InlineItem::nonBreakableEnd const):
(WebCore::Layout::InlineItem::addNonBreakableStart):
(WebCore::Layout::InlineItem::addNonBreakableEnd):

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

Source/WebCore/ChangeLog
Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
Source/WebCore/layout/inlineformatting/InlineItem.h

index 48869eb..2f0e2a2 100644 (file)
@@ -1,3 +1,35 @@
+2018-11-20  Zalan Butjas  <zalan@apple.com>
+
+        [LFC][IFC] Introduce InlineItem::nonBreakableStart/End
+        https://bugs.webkit.org/show_bug.cgi?id=191839
+
+        Reviewed by Antti Koivisto.
+
+        Non-breakable start/end marks margin/padding/border space (even when it does not directly come from the associated layout box)
+
+        <span style="padding: 5px"><span>nested content with padding parent</span</span>
+        <nested content with padding parent> <- inline run has 5px non-breakable start/end.
+
+        <span style="border: 5px solid green"><span style="padding-right: 10px; margin-right: 1px">1</span>2</span><span>    3</span>
+        <1> <- inline run has 5px non-breakable start and 11px non-breakable end.
+        <2> <- inline run has 0px non-breakable start and 5px non-breakable end.
+        <3> <- no non-breakable values.
+
+        This is what the runs look like (input to line breaking)
+        <     1           2     >
+        < > (whitespace)
+        <3>
+        The line breaking treats the paddding/border etc space as part of the run and as non-breaking opportunity.
+        With the given runs the first position where we can break the line is at the whitespace.
+
+        * layout/inlineformatting/InlineFormattingContext.cpp:
+        (WebCore::Layout::InlineFormattingContext::collectInlineContentForSubtree const):
+        * layout/inlineformatting/InlineItem.h:
+        (WebCore::Layout::InlineItem::nonBreakableStart const):
+        (WebCore::Layout::InlineItem::nonBreakableEnd const):
+        (WebCore::Layout::InlineItem::addNonBreakableStart):
+        (WebCore::Layout::InlineItem::addNonBreakableEnd):
+
 2018-11-20  Zalan Bujtas  <zalan@apple.com>
 
         [LFC][IFC] Move detaching rules from InlineFormattingState to InlineItem
index 75c3f45..f5cc300 100644 (file)
@@ -477,6 +477,8 @@ void InlineFormattingContext::collectInlineContentForSubtree(const Box& root, In
         child = child->nextInFlowOrFloatingSibling();
     }
 
+    // FIXME: Revisit this when we figured out how inline boxes fit the display tree.
+    auto padding = Geometry::computedPadding(layoutState(), root);
     // Setup breaking boundaries for this subtree.
     auto* lastDescendantInlineBox = inlineFormattingState.lastInlineItem();
     // Empty container?
@@ -485,11 +487,15 @@ void InlineFormattingContext::collectInlineContentForSubtree(const Box& root, In
 
     auto rootBreaksAtStart = [&] {
         // FIXME: add padding-inline-start, margin-inline-start etc.
+        if (padding && padding->horizontal.left)
+            return true;
         return root.isPositioned();
     };
 
     auto rootBreaksAtEnd = [&] {
         // FIXME: add padding-inline-end, margin-inline-end etc.
+        if (padding && padding->horizontal.right)
+            return true;
         return root.isPositioned();
     };
 
@@ -505,10 +511,15 @@ void InlineFormattingContext::collectInlineContentForSubtree(const Box& root, In
 
         ASSERT(firstDescendantInlineBox);
         firstDescendantInlineBox->addDetachingRule(InlineItem::DetachingRule::BreakAtStart);
+        if (padding && padding->horizontal.left)
+            firstDescendantInlineBox->addNonBreakableStart(padding->horizontal.left);
     }
 
-    if (rootBreaksAtEnd())
+    if (rootBreaksAtEnd()) {
         lastDescendantInlineBox->addDetachingRule(InlineItem::DetachingRule::BreakAtEnd);
+        if (padding && padding->horizontal.right)
+            lastDescendantInlineBox->addNonBreakableEnd(padding->horizontal.right);
+    }
 }
 
 void InlineFormattingContext::collectInlineContent(InlineRunProvider& inlineRunProvider) const
index 1d19b8c..ea3c0f5 100644 (file)
@@ -68,9 +68,19 @@ public:
     void addDetachingRule(OptionSet<DetachingRule> detachingRule) { m_detachingRules.add(detachingRule); }
     OptionSet<DetachingRule> detachingRules() const { return m_detachingRules; }
 
+    // Non-breakable start/end marks margin/padding/border space (even when it does not directly come from the associated layout box)
+    // <span style="padding: 5px"><span>nested content with padding parent</span</span>
+    // <nested content with padding parent> inline run has 5px non-breakable start/end.
+    LayoutUnit nonBreakableStart() const { return m_nonBreakableStart; }
+    LayoutUnit nonBreakableEnd() const { return m_nonBreakableEnd; }
+    void addNonBreakableStart(LayoutUnit value) { m_nonBreakableStart += value; }
+    void addNonBreakableEnd(LayoutUnit value) { m_nonBreakableEnd += value; }
+
 private:
     const Box& m_layoutBox;
     OptionSet<DetachingRule> m_detachingRules;
+    LayoutUnit m_nonBreakableStart;
+    LayoutUnit m_nonBreakableEnd;
 };
 
 // FIXME: Fix HashSet/ListHashSet to support smart pointer types.