⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285807 in webkit


Ignore:
Timestamp:
Nov 15, 2021, 7:51:44 AM (5 years ago)
Author:
Antti Koivisto
Message:

[LFC][Integration] fast/text/international/bidi-innertext.html fails with BiDi enabled
https://bugs.webkit.org/show_bug.cgi?id=233125

Reviewed by Alan Bujtas.

TextIterator needs to know that RenderText contains bidi text.

  • layout/formattingContexts/inline/InlineItemsBuilder.cpp:

(WebCore::Layout::InlineItemsBuilder::handleTextContent):

Use the InlineTextBox bit.

  • layout/formattingContexts/inline/text/TextUtil.cpp:

(WebCore::Layout::TextUtil::containsBidiText):

Add a helper.

  • layout/formattingContexts/inline/text/TextUtil.h:
  • layout/integration/InlineIteratorLogicalOrderTraversal.cpp:

(WebCore::InlineIterator::makeTextLogicalOrderCacheIfNeeded):

  • layout/integration/LayoutIntegrationBoxTree.cpp:

(WebCore::LayoutIntegration::BoxTree::buildTree):

  • layout/layouttree/LayoutInlineTextBox.cpp:

(WebCore::Layout::InlineTextBox::InlineTextBox):
(WebCore::Layout::m_containsBidiText):

Add a bit to the InlineTextBox.

(WebCore::Layout::m_canUseSimplifiedContentMeasuring): Deleted.

  • layout/layouttree/LayoutInlineTextBox.h:

(WebCore::Layout::InlineTextBox::containsBidiText const):

  • layout/layouttree/LayoutTreeBuilder.cpp:

(WebCore::Layout::TreeBuilder::createTextBox):

  • rendering/RenderText.cpp:

(WebCore::RenderText::RenderText):
(WebCore::RenderText::positionLineBox):

  • rendering/RenderText.h:

(WebCore::RenderText::containsBidiText const):
(WebCore::RenderText::setContainsBidiText):
(WebCore::RenderText::containsReversedText const): Deleted.

Location:
trunk/Source/WebCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r285806 r285807  
     12021-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
    1442021-11-15  Alan Bujtas  <zalan@apple.com>
    245
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp

    r285780 r285807  
    3838namespace WebCore {
    3939namespace Layout {
    40 
    41 #define ALLOW_BIDI_CONTENT 0
    4240
    4341struct WhitespaceContent {
     
    359357        return inlineItems.append(InlineTextItem::createEmptyItem(inlineTextBox));
    360358
     359    if (inlineTextBox.containsBidiText())
     360        m_hasSeenBidiContent = true;
     361
    361362    auto& style = inlineTextBox.style();
    362363    auto& fontCascade = style.fontCascade();
     
    436437            inlineItems.append(InlineTextItem::createNonWhitespaceItem(inlineTextBox, startPosition, inlineItemLength, UBIDI_DEFAULT_LTR, hasTrailingSoftHyphen, inlineItemWidth(startPosition, inlineItemLength)));
    437438            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
    459440            return true;
    460441        };
  • trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp

    r285016 r285807  
    252252}
    253253
     254bool 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
    254279}
    255280}
  • trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h

    r284780 r285807  
    6565    static bool canUseSimplifiedTextMeasuringForFirstLine(const RenderStyle&, const RenderStyle& firstLineStyle);
    6666    static bool isWrappingAllowed(const RenderStyle&);
     67    static bool containsBidiText(StringView);
    6768};
    6869
  • trunk/Source/WebCore/layout/integration/InlineIteratorLogicalOrderTraversal.cpp

    r284857 r285807  
    3434static TextLogicalOrderCache makeTextLogicalOrderCacheIfNeeded(const RenderText& text)
    3535{
    36     if (!text.containsReversedText())
     36    if (!text.containsBidiText())
    3737        return { };
    3838
  • trunk/Source/WebCore/layout/integration/LayoutIntegrationBoxTree.cpp

    r285782 r285807  
    9898                return !firstLineStyle || Layout::TextUtil::canUseSimplifiedTextMeasuringForFirstLine(style, *firstLineStyle);
    9999            }();
    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));
    103106        }
    104107
  • trunk/Source/WebCore/layout/layouttree/LayoutInlineTextBox.cpp

    r283234 r285807  
    3737WTF_MAKE_ISO_ALLOCATED_IMPL(InlineTextBox);
    3838
    39 InlineTextBox::InlineTextBox(String content, bool canUseSimplifiedContentMeasuring, RenderStyle&& style, std::unique_ptr<RenderStyle>&& firstLineStyle)
     39InlineTextBox::InlineTextBox(String content, bool canUseSimplifiedContentMeasuring, bool containsBidiText, RenderStyle&& style, std::unique_ptr<RenderStyle>&& firstLineStyle)
    4040    : Box({ }, WTFMove(style), WTFMove(firstLineStyle), Box::InlineTextBoxFlag)
    4141    , m_content(content)
    4242    , m_canUseSimplifiedContentMeasuring(canUseSimplifiedContentMeasuring)
     43    , m_containsBidiText(containsBidiText)
    4344{
    4445    setIsAnonymous();
  • trunk/Source/WebCore/layout/layouttree/LayoutInlineTextBox.h

    r283234 r285807  
    3838    WTF_MAKE_ISO_ALLOCATED(InlineTextBox);
    3939public:
    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);
    4141    virtual ~InlineTextBox() = default;
    4242
     
    4444    // FIXME: This should not be a box's property.
    4545    bool canUseSimplifiedContentMeasuring() const { return m_canUseSimplifiedContentMeasuring; }
     46    bool containsBidiText() const { return m_containsBidiText; }
    4647
    4748private:
    4849    String m_content;
    4950    bool m_canUseSimplifiedContentMeasuring { false };
     51    bool m_containsBidiText { false };
    5052};
    5153
  • trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp

    r283620 r285807  
    6060#include "RenderTableCell.h"
    6161#include "RenderView.h"
     62#include "TextUtil.h"
    6263#include "WidthIterator.h"
    6364#include <wtf/IsoMallocInlines.h>
     
    134135std::unique_ptr<Box> TreeBuilder::createTextBox(String text, bool canUseSimplifiedTextMeasuring, RenderStyle&& style)
    135136{
    136     return makeUnique<InlineTextBox>(text, canUseSimplifiedTextMeasuring, WTFMove(style));
     137    return makeUnique<InlineTextBox>(text, canUseSimplifiedTextMeasuring, TextUtil::containsBidiText(text), WTFMove(style));
    137138}
    138139
  • trunk/Source/WebCore/rendering/RenderText.cpp

    r284269 r285807  
    191191    , m_hasTab(false)
    192192    , m_linesDirty(false)
    193     , m_containsReversedText(false)
     193    , m_containsBidiText(false)
    194194    , m_isAllASCII(text.impl()->isAllASCII())
    195195    , m_knownToHaveNoOverflowAndNoFallbackFonts(false)
     
    15221522    if (!textBox.hasTextContent())
    15231523        return;
    1524     m_containsReversedText |= !textBox.isLeftToRightDirection();
     1524    m_containsBidiText |= !textBox.isLeftToRightDirection();
    15251525}
    15261526
  • trunk/Source/WebCore/rendering/RenderText.h

    r283481 r285807  
    146146    int nextOffset(int current) const final;
    147147
    148     bool containsReversedText() const { return m_containsReversedText; }
     148    bool containsBidiText() const { return m_containsBidiText; }
     149    void setContainsBidiText() { m_containsBidiText = true; }
    149150
    150151    void momentarilyRevealLastTypedCharacter(unsigned offsetAfterLastTypedCharacter);
     
    232233                           // just dirtying everything when character data is modified (e.g., appended/inserted
    233234                           // or removed).
    234     unsigned m_containsReversedText : 1;
     235    unsigned m_containsBidiText : 1;
    235236    unsigned m_isAllASCII : 1;
    236237    unsigned m_canUseSimpleFontCodePath : 1;
Note: See TracChangeset for help on using the changeset viewer.