Title: [285079] trunk/Source/WebCore
Revision
285079
Author
za...@apple.com
Date
2021-10-30 06:44:39 -0700 (Sat, 30 Oct 2021)

Log Message

[LFC][IFC] InlineItem should not cross bidi level boundary
https://bugs.webkit.org/show_bug.cgi?id=232509

Reviewed by Antti Koivisto.

Every inline item has a bidi level even when the content is not considered strictly as bidi (i.e. we don't call into ubidi to figure level information).

* layout/formattingContexts/inline/InlineItem.h:
(WebCore::Layout::InlineItem::bidiLevel const):
(WebCore::Layout::InlineItem::InlineItem):
* layout/formattingContexts/inline/InlineItemsBuilder.cpp:
(WebCore::Layout::InlineItemsBuilder::createAndAppendTextItems):
* layout/formattingContexts/inline/InlineSoftLineBreakItem.h:
(WebCore::Layout::InlineSoftLineBreakItem::createSoftLineBreakItem):
(WebCore::Layout::InlineSoftLineBreakItem::InlineSoftLineBreakItem):
* layout/formattingContexts/inline/InlineTextItem.cpp:
(WebCore::Layout::InlineTextItem::InlineTextItem):
(WebCore::Layout::InlineTextItem::left const):
(WebCore::Layout::InlineTextItem::right const):
* layout/formattingContexts/inline/InlineTextItem.h:
(WebCore::Layout::InlineTextItem::createWhitespaceItem):
(WebCore::Layout::InlineTextItem::createNonWhitespaceItem):
(WebCore::Layout::InlineTextItem::createEmptyItem):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (285078 => 285079)


--- trunk/Source/WebCore/ChangeLog	2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/ChangeLog	2021-10-30 13:44:39 UTC (rev 285079)
@@ -1,3 +1,29 @@
+2021-10-30  Alan Bujtas  <za...@apple.com>
+
+        [LFC][IFC] InlineItem should not cross bidi level boundary
+        https://bugs.webkit.org/show_bug.cgi?id=232509
+
+        Reviewed by Antti Koivisto.
+
+        Every inline item has a bidi level even when the content is not considered strictly as bidi (i.e. we don't call into ubidi to figure level information).
+
+        * layout/formattingContexts/inline/InlineItem.h:
+        (WebCore::Layout::InlineItem::bidiLevel const):
+        (WebCore::Layout::InlineItem::InlineItem):
+        * layout/formattingContexts/inline/InlineItemsBuilder.cpp:
+        (WebCore::Layout::InlineItemsBuilder::createAndAppendTextItems):
+        * layout/formattingContexts/inline/InlineSoftLineBreakItem.h:
+        (WebCore::Layout::InlineSoftLineBreakItem::createSoftLineBreakItem):
+        (WebCore::Layout::InlineSoftLineBreakItem::InlineSoftLineBreakItem):
+        * layout/formattingContexts/inline/InlineTextItem.cpp:
+        (WebCore::Layout::InlineTextItem::InlineTextItem):
+        (WebCore::Layout::InlineTextItem::left const):
+        (WebCore::Layout::InlineTextItem::right const):
+        * layout/formattingContexts/inline/InlineTextItem.h:
+        (WebCore::Layout::InlineTextItem::createWhitespaceItem):
+        (WebCore::Layout::InlineTextItem::createNonWhitespaceItem):
+        (WebCore::Layout::InlineTextItem::createEmptyItem):
+
 2021-10-29  Alan Bujtas  <za...@apple.com>
 
         [LFC][IFC] Move InlineTextItem construction to InlineItemsBuilder

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h (285078 => 285079)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h	2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h	2021-10-30 13:44:39 UTC (rev 285079)
@@ -29,6 +29,7 @@
 
 #include "LayoutBox.h"
 #include "LayoutUnits.h"
+#include <unicode/ubidi.h>
 
 namespace WebCore {
 namespace Layout {
@@ -45,9 +46,10 @@
         InlineBoxEnd,
         Float
     };
-    InlineItem(const Box& layoutBox, Type);
+    InlineItem(const Box& layoutBox, Type, UBiDiLevel = UBIDI_DEFAULT_LTR);
 
     Type type() const { return m_type; }
+    UBiDiLevel bidiLevel() const { return m_bidiLevel; }
     const Box& layoutBox() const { return *m_layoutBox; }
     const RenderStyle& style() const { return layoutBox().style(); }
     const RenderStyle& firstLineStyle() const { return layoutBox().firstLineStyle(); }
@@ -65,6 +67,7 @@
 private:
     const Box* m_layoutBox { nullptr };
     Type m_type { };
+    UBiDiLevel m_bidiLevel { UBIDI_DEFAULT_LTR };
 
 protected:
     // For InlineTextItem
@@ -80,9 +83,10 @@
     unsigned m_startOrPosition { 0 };
 };
 
-inline InlineItem::InlineItem(const Box& layoutBox, Type type)
+inline InlineItem::InlineItem(const Box& layoutBox, Type type, UBiDiLevel bidiLevel)
     : m_layoutBox(&layoutBox)
     , m_type(type)
+    , m_bidiLevel(bidiLevel)
 {
 }
 

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2021-10-30 13:44:39 UTC (rev 285079)
@@ -170,7 +170,7 @@
             auto appendWhitespaceItem = [&] (auto startPosition, auto itemLength) {
                 auto simpleSingleWhitespaceContent = inlineTextBox.canUseSimplifiedContentMeasuring() && (itemLength == 1 || whitespaceContentIsTreatedAsSingleSpace);
                 auto width = simpleSingleWhitespaceContent ? std::make_optional(InlineLayoutUnit { fontCascade.spaceWidth() }) : inlineItemWidth(startPosition, itemLength);
-                formattingState.addInlineItem(InlineTextItem::createWhitespaceItem(inlineTextBox, startPosition, itemLength, whitespaceContent->isWordSeparator, width));
+                formattingState.addInlineItem(InlineTextItem::createWhitespaceItem(inlineTextBox, startPosition, itemLength, UBIDI_DEFAULT_LTR, whitespaceContent->isWordSeparator, width));
             };
             if (style.whiteSpace() == WhiteSpace::BreakSpaces) {
                 // https://www.w3.org/TR/css-text-3/#white-space-phase-1
@@ -207,7 +207,7 @@
         ASSERT(initialNonWhitespacePosition < currentPosition);
         ASSERT_IMPLIES(style.hyphens() == Hyphens::None, !hasTrailingSoftHyphen);
         auto length = currentPosition - initialNonWhitespacePosition;
-        formattingState.addInlineItem(InlineTextItem::createNonWhitespaceItem(inlineTextBox, initialNonWhitespacePosition, length, hasTrailingSoftHyphen, inlineItemWidth(initialNonWhitespacePosition, length)));
+        formattingState.addInlineItem(InlineTextItem::createNonWhitespaceItem(inlineTextBox, initialNonWhitespacePosition, length, UBIDI_DEFAULT_LTR, hasTrailingSoftHyphen, inlineItemWidth(initialNonWhitespacePosition, length)));
     }
 }
 }

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineSoftLineBreakItem.h (285078 => 285079)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineSoftLineBreakItem.h	2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineSoftLineBreakItem.h	2021-10-30 13:44:39 UTC (rev 285079)
@@ -34,21 +34,22 @@
 
 class InlineSoftLineBreakItem : public InlineItem {
 public:
-    static InlineSoftLineBreakItem createSoftLineBreakItem(const InlineTextBox&, unsigned position);
+    static InlineSoftLineBreakItem createSoftLineBreakItem(const InlineTextBox&, unsigned position, UBiDiLevel = UBIDI_DEFAULT_LTR);
 
     unsigned position() const { return m_startOrPosition; }
     const InlineTextBox& inlineTextBox() const { return downcast<InlineTextBox>(layoutBox()); }
 
-    InlineSoftLineBreakItem(const InlineTextBox&, unsigned position);
+private:
+    InlineSoftLineBreakItem(const InlineTextBox&, unsigned position, UBiDiLevel);
 };
 
-inline InlineSoftLineBreakItem InlineSoftLineBreakItem::createSoftLineBreakItem(const InlineTextBox& inlineTextBox, unsigned position)
+inline InlineSoftLineBreakItem InlineSoftLineBreakItem::createSoftLineBreakItem(const InlineTextBox& inlineTextBox, unsigned position, UBiDiLevel bidiLevel)
 {
-    return { inlineTextBox, position };
+    return { inlineTextBox, position, bidiLevel };
 }
 
-inline InlineSoftLineBreakItem::InlineSoftLineBreakItem(const InlineTextBox& inlineTextBox, unsigned position)
-    : InlineItem(inlineTextBox, Type::SoftLineBreak)
+inline InlineSoftLineBreakItem::InlineSoftLineBreakItem(const InlineTextBox& inlineTextBox, unsigned position, UBiDiLevel bidiLevel)
+    : InlineItem(inlineTextBox, Type::SoftLineBreak, bidiLevel)
 {
     m_startOrPosition = position;
 }

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.cpp (285078 => 285079)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.cpp	2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.cpp	2021-10-30 13:44:39 UTC (rev 285079)
@@ -38,8 +38,8 @@
 
 static_assert(sizeof(InlineItem) == sizeof(InlineTextItem), "");
 
-InlineTextItem::InlineTextItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, bool hasTrailingSoftHyphen, bool isWordSeparator, std::optional<InlineLayoutUnit> width, TextItemType textItemType)
-    : InlineItem(inlineTextBox, Type::Text)
+InlineTextItem::InlineTextItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, UBiDiLevel bidiLevel, bool hasTrailingSoftHyphen, bool isWordSeparator, std::optional<InlineLayoutUnit> width, TextItemType textItemType)
+    : InlineItem(inlineTextBox, Type::Text, bidiLevel)
 {
     m_startOrPosition = start;
     m_length = length;
@@ -50,8 +50,8 @@
     m_textItemType = textItemType;
 }
 
-InlineTextItem::InlineTextItem(const InlineTextBox& inlineTextBox)
-    : InlineItem(inlineTextBox, Type::Text)
+InlineTextItem::InlineTextItem(const InlineTextBox& inlineTextBox, UBiDiLevel bidiLevel)
+    : InlineItem(inlineTextBox, Type::Text, bidiLevel)
 {
 }
 
@@ -60,7 +60,7 @@
     RELEASE_ASSERT(length <= this->length());
     ASSERT(m_textItemType != TextItemType::Undefined);
     ASSERT(length);
-    return { inlineTextBox(), start(), length, false, isWordSeparator(), std::nullopt, m_textItemType };
+    return { inlineTextBox(), start(), length, bidiLevel(), false, isWordSeparator(), std::nullopt, m_textItemType };
 }
 
 InlineTextItem InlineTextItem::right(unsigned length, std::optional<InlineLayoutUnit> width) const
@@ -68,7 +68,7 @@
     RELEASE_ASSERT(length <= this->length());
     ASSERT(m_textItemType != TextItemType::Undefined);
     ASSERT(length);
-    return { inlineTextBox(), end() - length, length, hasTrailingSoftHyphen(), isWordSeparator(), width, m_textItemType };
+    return { inlineTextBox(), end() - length, length, bidiLevel(), hasTrailingSoftHyphen(), isWordSeparator(), width, m_textItemType };
 }
 
 bool InlineTextItem::isZeroWidthSpaceSeparator() const

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.h (285078 => 285079)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.h	2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.h	2021-10-30 13:44:39 UTC (rev 285079)
@@ -37,9 +37,9 @@
 
 class InlineTextItem : public InlineItem {
 public:
-    static InlineTextItem createWhitespaceItem(const InlineTextBox&, unsigned start, unsigned length, bool isWordSeparator, std::optional<InlineLayoutUnit> width);
-    static InlineTextItem createNonWhitespaceItem(const InlineTextBox&, unsigned start, unsigned length, bool hasTrailingSoftHyphen, std::optional<InlineLayoutUnit> width);
-    static InlineTextItem createEmptyItem(const InlineTextBox&);
+    static InlineTextItem createWhitespaceItem(const InlineTextBox&, unsigned start, unsigned length, UBiDiLevel, bool isWordSeparator, std::optional<InlineLayoutUnit> width);
+    static InlineTextItem createNonWhitespaceItem(const InlineTextBox&, unsigned start, unsigned length, UBiDiLevel, bool hasTrailingSoftHyphen, std::optional<InlineLayoutUnit> width);
+    static InlineTextItem createEmptyItem(const InlineTextBox&, UBiDiLevel = UBIDI_DEFAULT_LTR);
 
     unsigned start() const { return m_startOrPosition; }
     unsigned end() const { return start() + length(); }
@@ -61,24 +61,24 @@
 private:
     using InlineItem::TextItemType;
 
-    InlineTextItem(const InlineTextBox&, unsigned start, unsigned length, bool hasTrailingSoftHyphen, bool isWordSeparator, std::optional<InlineLayoutUnit> width, TextItemType);
-    explicit InlineTextItem(const InlineTextBox&);
+    InlineTextItem(const InlineTextBox&, unsigned start, unsigned length, UBiDiLevel, bool hasTrailingSoftHyphen, bool isWordSeparator, std::optional<InlineLayoutUnit> width, TextItemType);
+    explicit InlineTextItem(const InlineTextBox&, UBiDiLevel);
 };
 
-inline InlineTextItem InlineTextItem::createWhitespaceItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, bool isWordSeparator, std::optional<InlineLayoutUnit> width)
+inline InlineTextItem InlineTextItem::createWhitespaceItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, UBiDiLevel bidiLevel, bool isWordSeparator, std::optional<InlineLayoutUnit> width)
 {
-    return { inlineTextBox, start, length, false, isWordSeparator, width, TextItemType::Whitespace };
+    return { inlineTextBox, start, length, bidiLevel, false, isWordSeparator, width, TextItemType::Whitespace };
 }
 
-inline InlineTextItem InlineTextItem::createNonWhitespaceItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, bool hasTrailingSoftHyphen, std::optional<InlineLayoutUnit> width)
+inline InlineTextItem InlineTextItem::createNonWhitespaceItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, UBiDiLevel bidiLevel, bool hasTrailingSoftHyphen, std::optional<InlineLayoutUnit> width)
 {
     // FIXME: Use the following list of non-whitespace characters to set the "isWordSeparator" bit: noBreakSpace, ethiopicWordspace, aegeanWordSeparatorLine aegeanWordSeparatorDot ugariticWordDivider.
-    return { inlineTextBox, start, length, hasTrailingSoftHyphen, false, width, TextItemType::NonWhitespace };
+    return { inlineTextBox, start, length, bidiLevel, hasTrailingSoftHyphen, false, width, TextItemType::NonWhitespace };
 }
 
-inline InlineTextItem InlineTextItem::createEmptyItem(const InlineTextBox& inlineTextBox)
+inline InlineTextItem InlineTextItem::createEmptyItem(const InlineTextBox& inlineTextBox, UBiDiLevel bidiLevel)
 {
-    return InlineTextItem { inlineTextBox };
+    return InlineTextItem { inlineTextBox, bidiLevel };
 }
 
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to