Changeset 285807 in webkit
- Timestamp:
- Nov 15, 2021, 7:51:44 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 11 edited
-
ChangeLog (modified) (1 diff)
-
layout/formattingContexts/inline/InlineItemsBuilder.cpp (modified) (3 diffs)
-
layout/formattingContexts/inline/text/TextUtil.cpp (modified) (1 diff)
-
layout/formattingContexts/inline/text/TextUtil.h (modified) (1 diff)
-
layout/integration/InlineIteratorLogicalOrderTraversal.cpp (modified) (1 diff)
-
layout/integration/LayoutIntegrationBoxTree.cpp (modified) (1 diff)
-
layout/layouttree/LayoutInlineTextBox.cpp (modified) (1 diff)
-
layout/layouttree/LayoutInlineTextBox.h (modified) (2 diffs)
-
layout/layouttree/LayoutTreeBuilder.cpp (modified) (2 diffs)
-
rendering/RenderText.cpp (modified) (2 diffs)
-
rendering/RenderText.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r285806 r285807 1 2021-11-15 Antti Koivisto <antti@apple.com> 2 3 [LFC][Integration] fast/text/international/bidi-innertext.html fails with BiDi enabled 4 https://bugs.webkit.org/show_bug.cgi?id=233125 5 6 Reviewed by Alan Bujtas. 7 8 TextIterator needs to know that RenderText contains bidi text. 9 10 * layout/formattingContexts/inline/InlineItemsBuilder.cpp: 11 (WebCore::Layout::InlineItemsBuilder::handleTextContent): 12 13 Use the InlineTextBox bit. 14 15 * layout/formattingContexts/inline/text/TextUtil.cpp: 16 (WebCore::Layout::TextUtil::containsBidiText): 17 18 Add a helper. 19 20 * layout/formattingContexts/inline/text/TextUtil.h: 21 * layout/integration/InlineIteratorLogicalOrderTraversal.cpp: 22 (WebCore::InlineIterator::makeTextLogicalOrderCacheIfNeeded): 23 * layout/integration/LayoutIntegrationBoxTree.cpp: 24 (WebCore::LayoutIntegration::BoxTree::buildTree): 25 * layout/layouttree/LayoutInlineTextBox.cpp: 26 (WebCore::Layout::InlineTextBox::InlineTextBox): 27 (WebCore::Layout::m_containsBidiText): 28 29 Add a bit to the InlineTextBox. 30 31 (WebCore::Layout::m_canUseSimplifiedContentMeasuring): Deleted. 32 * layout/layouttree/LayoutInlineTextBox.h: 33 (WebCore::Layout::InlineTextBox::containsBidiText const): 34 * layout/layouttree/LayoutTreeBuilder.cpp: 35 (WebCore::Layout::TreeBuilder::createTextBox): 36 * rendering/RenderText.cpp: 37 (WebCore::RenderText::RenderText): 38 (WebCore::RenderText::positionLineBox): 39 * rendering/RenderText.h: 40 (WebCore::RenderText::containsBidiText const): 41 (WebCore::RenderText::setContainsBidiText): 42 (WebCore::RenderText::containsReversedText const): Deleted. 43 1 44 2021-11-15 Alan Bujtas <zalan@apple.com> 2 45 -
trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp
r285780 r285807 38 38 namespace WebCore { 39 39 namespace Layout { 40 41 #define ALLOW_BIDI_CONTENT 042 40 43 41 struct WhitespaceContent { … … 359 357 return inlineItems.append(InlineTextItem::createEmptyItem(inlineTextBox)); 360 358 359 if (inlineTextBox.containsBidiText()) 360 m_hasSeenBidiContent = true; 361 361 362 auto& style = inlineTextBox.style(); 362 363 auto& fontCascade = style.fontCascade(); … … 436 437 inlineItems.append(InlineTextItem::createNonWhitespaceItem(inlineTextBox, startPosition, inlineItemLength, UBIDI_DEFAULT_LTR, hasTrailingSoftHyphen, inlineItemWidth(startPosition, inlineItemLength))); 437 438 currentPosition = endPosition; 438 #if ALLOW_BIDI_CONTENT 439 // Check if the content has bidi dependency so that we have to start building the paragraph content for ubidi. 440 if (text.is8Bit() || hasSeenBidiContent()) 441 return true; 442 443 for (auto position = startPosition; position < endPosition;) { 444 UChar32 character; 445 U16_NEXT(text.characters16(), position, contentLength, character); 446 447 auto bidiCategory = u_charDirection(character); 448 m_hasSeenBidiContent = bidiCategory == U_RIGHT_TO_LEFT 449 || bidiCategory == U_RIGHT_TO_LEFT_ARABIC 450 || bidiCategory == U_RIGHT_TO_LEFT_EMBEDDING 451 || bidiCategory == U_RIGHT_TO_LEFT_OVERRIDE 452 || bidiCategory == U_LEFT_TO_RIGHT_EMBEDDING 453 || bidiCategory == U_LEFT_TO_RIGHT_OVERRIDE 454 || bidiCategory == U_POP_DIRECTIONAL_FORMAT; 455 if (m_hasSeenBidiContent) 456 break; 457 } 458 #endif 439 459 440 return true; 460 441 }; -
trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp
r285016 r285807 252 252 } 253 253 254 bool TextUtil::containsBidiText(StringView text) 255 { 256 if (text.is8Bit()) 257 return false; 258 259 auto length = text.length(); 260 for (size_t position = 0; position < length;) { 261 UChar32 character; 262 U16_NEXT(text.characters16(), position, length, character); 263 264 auto bidiCategory = u_charDirection(character); 265 bool hasBidiContent = bidiCategory == U_RIGHT_TO_LEFT 266 || bidiCategory == U_RIGHT_TO_LEFT_ARABIC 267 || bidiCategory == U_RIGHT_TO_LEFT_EMBEDDING 268 || bidiCategory == U_RIGHT_TO_LEFT_OVERRIDE 269 || bidiCategory == U_LEFT_TO_RIGHT_EMBEDDING 270 || bidiCategory == U_LEFT_TO_RIGHT_OVERRIDE 271 || bidiCategory == U_POP_DIRECTIONAL_FORMAT; 272 if (hasBidiContent) 273 return true; 274 } 275 276 return false; 277 } 278 254 279 } 255 280 } -
trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h
r284780 r285807 65 65 static bool canUseSimplifiedTextMeasuringForFirstLine(const RenderStyle&, const RenderStyle& firstLineStyle); 66 66 static bool isWrappingAllowed(const RenderStyle&); 67 static bool containsBidiText(StringView); 67 68 }; 68 69 -
trunk/Source/WebCore/layout/integration/InlineIteratorLogicalOrderTraversal.cpp
r284857 r285807 34 34 static TextLogicalOrderCache makeTextLogicalOrderCacheIfNeeded(const RenderText& text) 35 35 { 36 if (!text.contains ReversedText())36 if (!text.containsBidiText()) 37 37 return { }; 38 38 -
trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp
r285782 r285807 98 98 return !firstLineStyle || Layout::TextUtil::canUseSimplifiedTextMeasuringForFirstLine(style, *firstLineStyle); 99 99 }(); 100 return makeUnique<Layout::InlineTextBox>( 101 style.textSecurity() == TextSecurity::None ? textRenderer.text() : RenderBlock::updateSecurityDiscCharacters(style, textRenderer.text()) 102 , canUseSimplifiedTextMeasuring, WTFMove(style), WTFMove(firstLineStyle)); 100 auto text = style.textSecurity() == TextSecurity::None ? textRenderer.text() : RenderBlock::updateSecurityDiscCharacters(style, textRenderer.text()); 101 auto containsBidiText = Layout::TextUtil::containsBidiText(text); 102 if (containsBidiText) 103 textRenderer.setContainsBidiText(); 104 105 return makeUnique<Layout::InlineTextBox>(text, canUseSimplifiedTextMeasuring, containsBidiText, WTFMove(style), WTFMove(firstLineStyle)); 103 106 } 104 107 -
trunk/Source/WebCore/layout/layouttree/LayoutInlineTextBox.cpp
r283234 r285807 37 37 WTF_MAKE_ISO_ALLOCATED_IMPL(InlineTextBox); 38 38 39 InlineTextBox::InlineTextBox(String content, bool canUseSimplifiedContentMeasuring, RenderStyle&& style, std::unique_ptr<RenderStyle>&& firstLineStyle)39 InlineTextBox::InlineTextBox(String content, bool canUseSimplifiedContentMeasuring, bool containsBidiText, RenderStyle&& style, std::unique_ptr<RenderStyle>&& firstLineStyle) 40 40 : Box({ }, WTFMove(style), WTFMove(firstLineStyle), Box::InlineTextBoxFlag) 41 41 , m_content(content) 42 42 , m_canUseSimplifiedContentMeasuring(canUseSimplifiedContentMeasuring) 43 , m_containsBidiText(containsBidiText) 43 44 { 44 45 setIsAnonymous(); -
trunk/Source/WebCore/layout/layouttree/LayoutInlineTextBox.h
r283234 r285807 38 38 WTF_MAKE_ISO_ALLOCATED(InlineTextBox); 39 39 public: 40 InlineTextBox(String, bool canUseSimplifiedContentMeasuring, RenderStyle&&, std::unique_ptr<RenderStyle>&& firstLineStyle = nullptr);40 InlineTextBox(String, bool canUseSimplifiedContentMeasuring, bool containsBidiText, RenderStyle&&, std::unique_ptr<RenderStyle>&& firstLineStyle = nullptr); 41 41 virtual ~InlineTextBox() = default; 42 42 … … 44 44 // FIXME: This should not be a box's property. 45 45 bool canUseSimplifiedContentMeasuring() const { return m_canUseSimplifiedContentMeasuring; } 46 bool containsBidiText() const { return m_containsBidiText; } 46 47 47 48 private: 48 49 String m_content; 49 50 bool m_canUseSimplifiedContentMeasuring { false }; 51 bool m_containsBidiText { false }; 50 52 }; 51 53 -
trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp
r283620 r285807 60 60 #include "RenderTableCell.h" 61 61 #include "RenderView.h" 62 #include "TextUtil.h" 62 63 #include "WidthIterator.h" 63 64 #include <wtf/IsoMallocInlines.h> … … 134 135 std::unique_ptr<Box> TreeBuilder::createTextBox(String text, bool canUseSimplifiedTextMeasuring, RenderStyle&& style) 135 136 { 136 return makeUnique<InlineTextBox>(text, canUseSimplifiedTextMeasuring, WTFMove(style));137 return makeUnique<InlineTextBox>(text, canUseSimplifiedTextMeasuring, TextUtil::containsBidiText(text), WTFMove(style)); 137 138 } 138 139 -
trunk/Source/WebCore/rendering/RenderText.cpp
r284269 r285807 191 191 , m_hasTab(false) 192 192 , m_linesDirty(false) 193 , m_contains ReversedText(false)193 , m_containsBidiText(false) 194 194 , m_isAllASCII(text.impl()->isAllASCII()) 195 195 , m_knownToHaveNoOverflowAndNoFallbackFonts(false) … … 1522 1522 if (!textBox.hasTextContent()) 1523 1523 return; 1524 m_contains ReversedText |= !textBox.isLeftToRightDirection();1524 m_containsBidiText |= !textBox.isLeftToRightDirection(); 1525 1525 } 1526 1526 -
trunk/Source/WebCore/rendering/RenderText.h
r283481 r285807 146 146 int nextOffset(int current) const final; 147 147 148 bool containsReversedText() const { return m_containsReversedText; } 148 bool containsBidiText() const { return m_containsBidiText; } 149 void setContainsBidiText() { m_containsBidiText = true; } 149 150 150 151 void momentarilyRevealLastTypedCharacter(unsigned offsetAfterLastTypedCharacter); … … 232 233 // just dirtying everything when character data is modified (e.g., appended/inserted 233 234 // or removed). 234 unsigned m_contains ReversedText : 1;235 unsigned m_containsBidiText : 1; 235 236 unsigned m_isAllASCII : 1; 236 237 unsigned m_canUseSimpleFontCodePath : 1;
Note:
See TracChangeset
for help on using the changeset viewer.