Title: [285093] trunk/Source/WebCore
Revision
285093
Author
[email protected]
Date
2021-10-31 07:25:44 -0700 (Sun, 31 Oct 2021)

Log Message

[LFC][IFC] Add unicode-bidi control characters
https://bugs.webkit.org/show_bug.cgi?id=232538

Reviewed by Antti Koivisto.

This is preparation for injecting entering/exiting control characters into the paragraph string used by ubidi.

* layout/formattingContexts/inline/InlineItemsBuilder.cpp:
(WebCore::Layout::InlineItemsBuilder::handleInlineBox):
(WebCore::Layout::InlineItemsBuilder::enterBidiContext):
(WebCore::Layout::InlineItemsBuilder::exitBidiContext):
* layout/formattingContexts/inline/InlineItemsBuilder.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (285092 => 285093)


--- trunk/Source/WebCore/ChangeLog	2021-10-31 13:41:34 UTC (rev 285092)
+++ trunk/Source/WebCore/ChangeLog	2021-10-31 14:25:44 UTC (rev 285093)
@@ -1,3 +1,18 @@
+2021-10-31  Alan Bujtas  <[email protected]>
+
+        [LFC][IFC] Add unicode-bidi control characters
+        https://bugs.webkit.org/show_bug.cgi?id=232538
+
+        Reviewed by Antti Koivisto.
+
+        This is preparation for injecting entering/exiting control characters into the paragraph string used by ubidi.
+
+        * layout/formattingContexts/inline/InlineItemsBuilder.cpp:
+        (WebCore::Layout::InlineItemsBuilder::handleInlineBox):
+        (WebCore::Layout::InlineItemsBuilder::enterBidiContext):
+        (WebCore::Layout::InlineItemsBuilder::exitBidiContext):
+        * layout/formattingContexts/inline/InlineItemsBuilder.h:
+
 2021-10-31  Andres Gonzalez  <[email protected]>
 
         Move handling of ChildrenChanged notifications out of the AccessibilityObjects into AXObjectCache.

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp (285092 => 285093)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2021-10-31 13:41:34 UTC (rev 285092)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2021-10-31 14:25:44 UTC (rev 285093)
@@ -99,7 +99,7 @@
             if (!isInlineBoxWithInlineContent)
                 break;
             // This is the start of an inline box (e.g. <span>).
-            handleInlineBox(layoutBox, EnterInlineBox::Yes, inlineItems);
+            handleInlineBoxStart(layoutBox, inlineItems);
             auto& inlineBox = downcast<ContainerBox>(layoutBox);
             if (!inlineBox.hasChild())
                 break;
@@ -113,7 +113,7 @@
             else if (layoutBox.isAtomicInlineLevelBox() || layoutBox.isLineBreakBox())
                 handleInlineLevelBox(layoutBox, inlineItems);
             else if (layoutBox.isInlineBox())
-                handleInlineBox(layoutBox, EnterInlineBox::No, inlineItems);
+                handleInlineBoxEnd(layoutBox, inlineItems);
             else if (layoutBox.isFloatingPositioned())
                 inlineItems.append({ layoutBox, InlineItem::Type::Float });
             else if (layoutBox.isOutOfFlowPositioned()) {
@@ -217,12 +217,91 @@
     }
 }
 
-void InlineItemsBuilder::handleInlineBox(const Box& inlineBox, EnterInlineBox enterInlineBox, InlineItems& inlineItems)
+void InlineItemsBuilder::handleInlineBoxStart(const Box& inlineBox, InlineItems& inlineItems)
 {
-    // FIXME: Inject bidi control codes when crossing inline boxes with unicode-bidi/direction.
-    inlineItems.append({ inlineBox, enterInlineBox == EnterInlineBox::Yes ? InlineItem::Type::InlineBoxStart : InlineItem::Type::InlineBoxEnd });
+    inlineItems.append({ inlineBox, InlineItem::Type::InlineBoxStart });
+    // https://drafts.csswg.org/css-writing-modes/#unicode-bidi
+    auto& style = inlineBox.style();
+    if (style.rtlOrdering() == Order::Visual)
+        return;
+
+    auto isLeftToRightDirection = style.isLeftToRightDirection();
+    auto enteringContentControlChar = std::optional<UChar> { };
+    auto nestedContentControlChar = std::optional<UChar> { };
+
+    switch (style.unicodeBidi()) {
+    case EUnicodeBidi::UBNormal:
+        // The box does not open an additional level of embedding with respect to the bidirectional algorithm.
+        // For inline boxes, implicit reordering works across box boundaries.
+        break;
+    case EUnicodeBidi::Embed:
+        enteringContentControlChar = isLeftToRightDirection ? leftToRightEmbed : rightToLeftEmbed;
+        break;
+    case EUnicodeBidi::Override:
+        enteringContentControlChar = isLeftToRightDirection ? leftToRightOverride : rightToLeftOverride;
+        break;
+    case EUnicodeBidi::Isolate:
+        enteringContentControlChar = isLeftToRightDirection ? leftToRightIsolate : rightToLeftIsolate;
+        break;
+    case EUnicodeBidi::Plaintext:
+        enteringContentControlChar = firstStrongIsolate;
+        break;
+    case EUnicodeBidi::IsolateOverride:
+        enteringContentControlChar = firstStrongIsolate;
+        nestedContentControlChar = isLeftToRightDirection ? leftToRightOverride : rightToLeftOverride;
+        break;
+    default:
+        ASSERT_NOT_REACHED();
+    }
+
+    if (enteringContentControlChar)
+        enterBidiContext(inlineBox, *enteringContentControlChar);
+    if (nestedContentControlChar)
+        enterBidiContext(inlineBox, *nestedContentControlChar);
 }
 
+void InlineItemsBuilder::handleInlineBoxEnd(const Box& inlineBox, InlineItems& inlineItems)
+{
+    inlineItems.append({ inlineBox, InlineItem::Type::InlineBoxEnd });
+    // https://drafts.csswg.org/css-writing-modes/#unicode-bidi
+    auto& style = inlineBox.style();
+    if (style.rtlOrdering() == Order::Visual)
+        return;
+
+    auto exitingContentControlChar = std::optional<UChar> { };
+    auto nestedContentControlChar = std::optional<UChar> { };
+
+    switch (style.unicodeBidi()) {
+    case EUnicodeBidi::UBNormal:
+        // The box does not open an additional level of embedding with respect to the bidirectional algorithm.
+        // For inline boxes, implicit reordering works across box boundaries.
+        break;
+    case EUnicodeBidi::Embed:
+        exitingContentControlChar = popDirectionalFormatting;
+        break;
+    case EUnicodeBidi::Override:
+        exitingContentControlChar = popDirectionalFormatting;
+        break;
+    case EUnicodeBidi::Isolate:
+        exitingContentControlChar = popDirectionalIsolate;
+        break;
+    case EUnicodeBidi::Plaintext:
+        exitingContentControlChar = popDirectionalIsolate;
+        break;
+    case EUnicodeBidi::IsolateOverride:
+        nestedContentControlChar = popDirectionalFormatting;
+        exitingContentControlChar = popDirectionalIsolate;
+        break;
+    default:
+        ASSERT_NOT_REACHED();
+    }
+
+    if (nestedContentControlChar)
+        exitBidiContext(inlineBox, *nestedContentControlChar);
+    if (exitingContentControlChar)
+        exitBidiContext(inlineBox, *exitingContentControlChar);
+}
+
 void InlineItemsBuilder::handleInlineLevelBox(const Box& layoutBox, InlineItems& inlineItems)
 {
     if (layoutBox.isAtomicInlineLevelBox())
@@ -234,7 +313,17 @@
     ASSERT_NOT_REACHED();
 }
 
+void InlineItemsBuilder::enterBidiContext(const Box&, UChar)
+{
+    // FIXME: Inject the control character to the paragraph string.
 }
+
+void InlineItemsBuilder::exitBidiContext(const Box&, UChar)
+{
+    // FIXME: Inject the control character to the paragraph string.
 }
 
+}
+}
+
 #endif

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.h (285092 => 285093)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.h	2021-10-31 13:41:34 UTC (rev 285092)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.h	2021-10-31 14:25:44 UTC (rev 285093)
@@ -44,9 +44,12 @@
     void breakInlineItemsAtBidiBoundaries(InlineItems&);
 
     void handleTextContent(const InlineTextBox&, InlineItems&);
-    enum class EnterInlineBox { Yes, No };
-    void handleInlineBox(const Box&, EnterInlineBox, InlineItems&);
+    void handleInlineBoxStart(const Box&, InlineItems&);
+    void handleInlineBoxEnd(const Box&, InlineItems&);
     void handleInlineLevelBox(const Box&, InlineItems&);
+    
+    void enterBidiContext(const Box&, UChar);
+    void exitBidiContext(const Box&, UChar);
 
     const ContainerBox& root() const { return m_root; }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to