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