Title: [285136] trunk/Source/WebCore
Revision
285136
Author
[email protected]
Date
2021-11-01 15:09:41 -0700 (Mon, 01 Nov 2021)

Log Message

[LFC][IFC] Stop measuring text while collecting inline items when content needs bidi split
https://bugs.webkit.org/show_bug.cgi?id=232571

Reviewed by Antti Koivisto.

When we know we are going to do bidi processing, these inline item width results will most likely become stale at breakAndComputeBidiLevels.

* layout/formattingContexts/inline/InlineItemsBuilder.cpp:
(WebCore::Layout::InlineItemsBuilder::breakAndComputeBidiLevels):
(WebCore::Layout::InlineItemsBuilder::handleTextContent):
(WebCore::Layout::InlineItemsBuilder::enterBidiContext):
(WebCore::Layout::InlineItemsBuilder::exitBidiContext):
(WebCore::Layout::InlineItemsBuilder::buildPreviousTextContent):
* layout/formattingContexts/inline/InlineItemsBuilder.h:
(WebCore::Layout::InlineItemsBuilder::isBiDiContent const):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (285135 => 285136)


--- trunk/Source/WebCore/ChangeLog	2021-11-01 22:09:33 UTC (rev 285135)
+++ trunk/Source/WebCore/ChangeLog	2021-11-01 22:09:41 UTC (rev 285136)
@@ -1,3 +1,21 @@
+2021-11-01  Alan Bujtas  <[email protected]>
+
+        [LFC][IFC] Stop measuring text while collecting inline items when content needs bidi split
+        https://bugs.webkit.org/show_bug.cgi?id=232571
+
+        Reviewed by Antti Koivisto.
+
+        When we know we are going to do bidi processing, these inline item width results will most likely become stale at breakAndComputeBidiLevels.
+
+        * layout/formattingContexts/inline/InlineItemsBuilder.cpp:
+        (WebCore::Layout::InlineItemsBuilder::breakAndComputeBidiLevels):
+        (WebCore::Layout::InlineItemsBuilder::handleTextContent):
+        (WebCore::Layout::InlineItemsBuilder::enterBidiContext):
+        (WebCore::Layout::InlineItemsBuilder::exitBidiContext):
+        (WebCore::Layout::InlineItemsBuilder::buildPreviousTextContent):
+        * layout/formattingContexts/inline/InlineItemsBuilder.h:
+        (WebCore::Layout::InlineItemsBuilder::isBiDiContent const):
+
 2021-11-01  Devin Rousso  <[email protected]>
 
         [ iOS15 EWS ] TestWebKitAPI.CSSViewportUnits.SameUnobscuredSizeOverrides flaky fails on EWS

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2021-11-01 22:09:33 UTC (rev 285135)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2021-11-01 22:09:41 UTC (rev 285136)
@@ -136,7 +136,7 @@
 
 void InlineItemsBuilder::breakAndComputeBidiLevels(InlineItems& inlineItems)
 {
-    if (m_paragraphContentBuilder.isEmpty())
+    if (!hasSeenBidiContent())
         return;
     ASSERT(!inlineItems.isEmpty());
 
@@ -179,6 +179,7 @@
                     ++currentInlineItemIndex;
                     continue;
                 }
+                // FIXME: Find out if this is the most optimal place to measure and cache text widths. 
                 auto& inlineTextItem = downcast<InlineTextItem>(inlineItem);
                 inlineTextItem.setBidiLevel(level);
 
@@ -221,6 +222,10 @@
     unsigned currentPosition = 0;
 
     auto inlineItemWidth = [&](auto startPosition, auto length) -> std::optional<InlineLayoutUnit> {
+        if (hasSeenBidiContent()) {
+            // Delay content measuring until bidi split.
+            return { };
+        }
         if (!inlineTextBox.canUseSimplifiedContentMeasuring()
             || !TextUtil::canUseSimplifiedTextMeasuringForFirstLine(inlineTextBox.style(), inlineTextBox.firstLineStyle()))
             return { };
@@ -227,7 +232,7 @@
         return TextUtil::width(inlineTextBox, fontCascade, startPosition, startPosition + length, { });
     };
 
-    if (!m_paragraphContentBuilder.isEmpty()) {
+    if (hasSeenBidiContent()) {
         m_contentOffsetMap.set(&inlineTextBox, m_paragraphContentBuilder.length());
         m_paragraphContentBuilder.append(text);
     }
@@ -291,7 +296,7 @@
             currentPosition = endPosition;
 #if ALLOW_BIDI_CONTENT
             // Check if the content has bidi dependency so that we have to start building the paragraph content for ubidi.
-            if (text.is8Bit() || !m_paragraphContentBuilder.isEmpty())
+            if (text.is8Bit() || hasSeenBidiContent())
                 return true;
 
             for (auto position = startPosition; position < endPosition;) {
@@ -404,7 +409,7 @@
 
 void InlineItemsBuilder::enterBidiContext(const Box& box, UChar controlCharacter, const InlineItems& inlineItems)
 {
-    if (m_paragraphContentBuilder.isEmpty())
+    if (!hasSeenBidiContent())
         buildPreviousTextContent(inlineItems);
     // Let the first control character represent the  box.
     m_contentOffsetMap.add(&box, m_paragraphContentBuilder.length());
@@ -413,13 +418,13 @@
 
 void InlineItemsBuilder::exitBidiContext(const Box&, UChar controlCharacter)
 {
-    ASSERT(!m_paragraphContentBuilder.isEmpty());
+    ASSERT(hasSeenBidiContent());
     m_paragraphContentBuilder.append(controlCharacter);
 }
 
 void InlineItemsBuilder::buildPreviousTextContent(const InlineItems& inlineItems)
 {
-    ASSERT(m_paragraphContentBuilder.isEmpty());
+    ASSERT(!hasSeenBidiContent());
     ASSERT(m_contentOffsetMap.isEmpty());
 
     const Box* lastLayoutBox = nullptr;

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


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.h	2021-11-01 22:09:33 UTC (rev 285135)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.h	2021-11-01 22:09:41 UTC (rev 285136)
@@ -54,6 +54,8 @@
 
     void buildPreviousTextContent(const InlineItems&);
 
+    bool hasSeenBidiContent() const { return !m_paragraphContentBuilder.isEmpty(); }
+
     const ContainerBox& root() const { return m_root; }
 
     const ContainerBox& m_root;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to