Title: [286786] trunk/Source/WebCore
Revision
286786
Author
za...@apple.com
Date
2021-12-09 10:33:19 -0800 (Thu, 09 Dec 2021)

Log Message

[LFC][IFC] Add support for empty bidi inline boxes
https://bugs.webkit.org/show_bug.cgi?id=233896

Reviewed by Antti Koivisto.

Inline boxes with decoration only should also produce associated display boxes.

* layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
(WebCore::Layout::createdDisplayBoxNodeForContainerBoxAndPushToAncestorStack):
(WebCore::Layout::InlineDisplayContentBuilder::ensureDisplayBoxForContainer):
(WebCore::Layout::InlineDisplayContentBuilder::processBidiContent):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (286785 => 286786)


--- trunk/Source/WebCore/ChangeLog	2021-12-09 17:53:22 UTC (rev 286785)
+++ trunk/Source/WebCore/ChangeLog	2021-12-09 18:33:19 UTC (rev 286786)
@@ -1,3 +1,17 @@
+2021-12-09  Alan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] Add support for empty bidi inline boxes
+        https://bugs.webkit.org/show_bug.cgi?id=233896
+
+        Reviewed by Antti Koivisto.
+
+        Inline boxes with decoration only should also produce associated display boxes.
+
+        * layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp:
+        (WebCore::Layout::createdDisplayBoxNodeForContainerBoxAndPushToAncestorStack):
+        (WebCore::Layout::InlineDisplayContentBuilder::ensureDisplayBoxForContainer):
+        (WebCore::Layout::InlineDisplayContentBuilder::processBidiContent):
+
 2021-12-09  J Pascoe  <j_pas...@apple.com>
 
         [WebAuthn] Remove user gesture requirement for using platform authenticator on the web

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp (286785 => 286786)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp	2021-12-09 17:53:22 UTC (rev 286785)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineDisplayContentBuilder.cpp	2021-12-09 18:33:19 UTC (rev 286786)
@@ -363,6 +363,14 @@
     ListHashSet<const ContainerBox*> m_set;
 };
 
+static inline DisplayBoxNode& createdDisplayBoxNodeForContainerBoxAndPushToAncestorStack(const ContainerBox& containerBox, size_t displayBoxIndex, DisplayBoxNode& parentDisplayBoxNode, AncestorStack& ancestorStack)
+{
+    parentDisplayBoxNode.appendChild(displayBoxIndex);
+    auto& displayBoxNode = *parentDisplayBoxNode.children.last();
+    ancestorStack.push(displayBoxNode, containerBox);
+    return displayBoxNode;
+}
+
 DisplayBoxNode& InlineDisplayContentBuilder::ensureDisplayBoxForContainer(const ContainerBox& containerBox, AncestorStack& ancestorStack, DisplayBoxes& boxes)
 {
     ASSERT(containerBox.isInlineBox() || &containerBox == &root());
@@ -370,11 +378,7 @@
         return *lowestCommonAncestor;
     auto& enclosingDisplayBoxNodeForContainer = ensureDisplayBoxForContainer(containerBox.parent(), ancestorStack, boxes);
     boxes.append({ m_lineIndex, InlineDisplay::Box::Type::NonRootInlineBox, containerBox, UBIDI_DEFAULT_LTR, { }, { }, { }, { }, true, { } });
-
-    enclosingDisplayBoxNodeForContainer.appendChild(boxes.size() - 1);
-    auto& displayBoxNodeForContainer = *enclosingDisplayBoxNodeForContainer.children.last();
-    ancestorStack.push(displayBoxNodeForContainer, containerBox);
-    return displayBoxNodeForContainer;
+    return createdDisplayBoxNodeForContainerBoxAndPushToAncestorStack(containerBox, boxes.size() - 1, enclosingDisplayBoxNodeForContainer, ancestorStack);
 }
 
 void InlineDisplayContentBuilder::adjustVisualGeometryForChildNode(const DisplayBoxNode& displayBoxNode, InlineLayoutUnit& contentRightInVisualOrder, InlineLayoutUnit lineBoxLogicalTop, DisplayBoxes& boxes, const LineBox& lineBox)
@@ -454,11 +458,9 @@
             auto& lineRun = runs[visualIndex];
             auto& layoutBox = lineRun.layoutBox();
 
-            auto isContentRun = !lineRun.isInlineBoxStart() && !lineRun.isLineSpanningInlineBoxStart() && !lineRun.isInlineBoxEnd() && !lineRun.isWordBreakOpportunity();
-            if (!isContentRun) {
-                // FIXME: Add support for inline boxes with no content.
+            auto needsDisplayBox = !lineRun.isInlineBoxEnd() && !lineRun.isWordBreakOpportunity();
+            if (!needsDisplayBox)
                 continue;
-            }
 
             auto visualRectRelativeToRoot = [&](auto logicallRect) {
                 logicallRect.setLeft(contentRightInVisualOrder);
@@ -471,20 +473,36 @@
                 auto visualRect = visualRectRelativeToRoot(lineBox.logicalRectForTextRun(lineRun));
                 appendTextDisplayBox(lineRun, visualRect, boxes);
                 contentRightInVisualOrder += visualRect.width();
-            } else if (lineRun.isSoftLineBreak()) {
+                parentDisplayBoxNode.appendChild(boxes.size() - 1);
+                continue;
+            }
+            if (lineRun.isSoftLineBreak()) {
                 ASSERT(!visualRectRelativeToRoot(lineBox.logicalRectForTextRun(lineRun)).width());
                 appendSoftLineBreakDisplayBox(lineRun, visualRectRelativeToRoot(lineBox.logicalRectForTextRun(lineRun)), boxes);
-            } else if (lineRun.isHardLineBreak()) {
+                parentDisplayBoxNode.appendChild(boxes.size() - 1);
+                continue;
+            }
+            if (lineRun.isHardLineBreak()) {
                 ASSERT(!visualRectRelativeToRoot(lineBox.logicalRectForLineBreakBox(layoutBox)).width());
                 appendHardLineBreakDisplayBox(lineRun, visualRectRelativeToRoot(lineBox.logicalRectForLineBreakBox(layoutBox)), boxes);
-            } else if (lineRun.isBox()) {
+                parentDisplayBoxNode.appendChild(boxes.size() - 1);
+                continue;
+            }
+            if (lineRun.isBox()) {
                 auto& boxGeometry = formattingState().boxGeometry(layoutBox);
                 auto visualRect = visualRectRelativeToRoot(lineBox.logicalBorderBoxForAtomicInlineLevelBox(layoutBox, boxGeometry));
                 visualRect.moveHorizontally(boxGeometry.marginStart());
                 appendAtomicInlineLevelDisplayBox(lineRun, visualRect, boxes);
                 contentRightInVisualOrder += boxGeometry.marginStart() + visualRect.width() + boxGeometry.marginEnd();
+                parentDisplayBoxNode.appendChild(boxes.size() - 1);
+                continue;
             }
-            parentDisplayBoxNode.appendChild(boxes.size() - 1);
+            if (lineRun.isInlineBoxStart() || lineRun.isLineSpanningInlineBoxStart()) {
+                boxes.append({ m_lineIndex, InlineDisplay::Box::Type::NonRootInlineBox, layoutBox, UBIDI_DEFAULT_LTR, { }, { }, { }, { }, true, { } });
+                createdDisplayBoxNodeForContainerBoxAndPushToAncestorStack(downcast<ContainerBox>(layoutBox), boxes.size() - 1, parentDisplayBoxNode, ancestorStack);
+                continue;
+            }
+            ASSERT_NOT_REACHED();
         }
     };
     createDisplayBoxesInVisualOrder();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to