Skip to content

Commit

Permalink
[IFC] Inappropriate word order in the Arabic-English dictionary
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=265332
<rdar://99087118>

Reviewed by Antti Koivisto.

Inline box start/end markers with non-default unicode-bidi values do not participate in bidi reordering (they don't
inject control characters to initiate isolation/embedding). We also set their bidi levels to opaque to ensue ICU does not get confused while
running reordering.
However inline box start/end makers with injected control characters (e.g. <span style="unicode-bidi: isolate">isolated</span)
should keep their ICU assigned bidi level values for reordering.

* LayoutTests/fast/text/bidi-content-with-normal-inline-box-mispositioned-expected.html: Added.
* LayoutTests/fast/text/bidi-content-with-normal-inline-box-mispositioned.html: Added.
* Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp:
(WebCore::Layout::buildBidiParagraph):

Canonical link: https://commits.webkit.org/271112@main
  • Loading branch information
alanbaradlay committed Nov 25, 2023
1 parent 3e10929 commit 55edb4c
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<meta charset="utf-8">
<div>ش<span style="unicode-bidi: isolate">pass if this content is visually _not_ leading</span><div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<meta charset="utf-8">
<div><span></span>ش<span style="unicode-bidi: isolate">pass if this content is visually _not_ leading</span><div>
Original file line number Diff line number Diff line change
Expand Up @@ -601,15 +601,21 @@ void InlineItemsBuilder::breakAndComputeBidiLevels(InlineItemList& inlineItemLis
inlineBoxContentFlagStack.reserveInitialCapacity(inlineItemList.size());
for (auto index = inlineItemList.size(); index--;) {
auto& inlineItem = inlineItemList[index];
auto& style = inlineItem.style();
auto initiatesControlCharacter = style.rtlOrdering() == Order::Logical && style.unicodeBidi() != UnicodeBidi::Normal;

if (inlineItem.isInlineBoxStart()) {
ASSERT(!inlineBoxContentFlagStack.isEmpty());
if (inlineBoxContentFlagStack.takeLast() == InlineBoxHasContent::Yes)
inlineItemList[index].setBidiLevel(InlineItem::opaqueBidiLevel);
if (inlineBoxContentFlagStack.takeLast() == InlineBoxHasContent::Yes) {
if (!initiatesControlCharacter)
inlineItemList[index].setBidiLevel(InlineItem::opaqueBidiLevel);
}
continue;
}
if (inlineItem.isInlineBoxEnd()) {
inlineBoxContentFlagStack.append(InlineBoxHasContent::No);
inlineItem.setBidiLevel(InlineItem::opaqueBidiLevel);
if (!initiatesControlCharacter)
inlineItem.setBidiLevel(InlineItem::opaqueBidiLevel);
continue;
}
if (inlineItem.isWordBreakOpportunity()) {
Expand Down

0 comments on commit 55edb4c

Please sign in to comment.