Diff
Modified: trunk/Source/WebCore/ChangeLog (285078 => 285079)
--- trunk/Source/WebCore/ChangeLog 2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/ChangeLog 2021-10-30 13:44:39 UTC (rev 285079)
@@ -1,3 +1,29 @@
+2021-10-30 Alan Bujtas <za...@apple.com>
+
+ [LFC][IFC] InlineItem should not cross bidi level boundary
+ https://bugs.webkit.org/show_bug.cgi?id=232509
+
+ Reviewed by Antti Koivisto.
+
+ Every inline item has a bidi level even when the content is not considered strictly as bidi (i.e. we don't call into ubidi to figure level information).
+
+ * layout/formattingContexts/inline/InlineItem.h:
+ (WebCore::Layout::InlineItem::bidiLevel const):
+ (WebCore::Layout::InlineItem::InlineItem):
+ * layout/formattingContexts/inline/InlineItemsBuilder.cpp:
+ (WebCore::Layout::InlineItemsBuilder::createAndAppendTextItems):
+ * layout/formattingContexts/inline/InlineSoftLineBreakItem.h:
+ (WebCore::Layout::InlineSoftLineBreakItem::createSoftLineBreakItem):
+ (WebCore::Layout::InlineSoftLineBreakItem::InlineSoftLineBreakItem):
+ * layout/formattingContexts/inline/InlineTextItem.cpp:
+ (WebCore::Layout::InlineTextItem::InlineTextItem):
+ (WebCore::Layout::InlineTextItem::left const):
+ (WebCore::Layout::InlineTextItem::right const):
+ * layout/formattingContexts/inline/InlineTextItem.h:
+ (WebCore::Layout::InlineTextItem::createWhitespaceItem):
+ (WebCore::Layout::InlineTextItem::createNonWhitespaceItem):
+ (WebCore::Layout::InlineTextItem::createEmptyItem):
+
2021-10-29 Alan Bujtas <za...@apple.com>
[LFC][IFC] Move InlineTextItem construction to InlineItemsBuilder
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h (285078 => 285079)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h 2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItem.h 2021-10-30 13:44:39 UTC (rev 285079)
@@ -29,6 +29,7 @@
#include "LayoutBox.h"
#include "LayoutUnits.h"
+#include <unicode/ubidi.h>
namespace WebCore {
namespace Layout {
@@ -45,9 +46,10 @@
InlineBoxEnd,
Float
};
- InlineItem(const Box& layoutBox, Type);
+ InlineItem(const Box& layoutBox, Type, UBiDiLevel = UBIDI_DEFAULT_LTR);
Type type() const { return m_type; }
+ UBiDiLevel bidiLevel() const { return m_bidiLevel; }
const Box& layoutBox() const { return *m_layoutBox; }
const RenderStyle& style() const { return layoutBox().style(); }
const RenderStyle& firstLineStyle() const { return layoutBox().firstLineStyle(); }
@@ -65,6 +67,7 @@
private:
const Box* m_layoutBox { nullptr };
Type m_type { };
+ UBiDiLevel m_bidiLevel { UBIDI_DEFAULT_LTR };
protected:
// For InlineTextItem
@@ -80,9 +83,10 @@
unsigned m_startOrPosition { 0 };
};
-inline InlineItem::InlineItem(const Box& layoutBox, Type type)
+inline InlineItem::InlineItem(const Box& layoutBox, Type type, UBiDiLevel bidiLevel)
: m_layoutBox(&layoutBox)
, m_type(type)
+ , m_bidiLevel(bidiLevel)
{
}
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp (285078 => 285079)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp 2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp 2021-10-30 13:44:39 UTC (rev 285079)
@@ -170,7 +170,7 @@
auto appendWhitespaceItem = [&] (auto startPosition, auto itemLength) {
auto simpleSingleWhitespaceContent = inlineTextBox.canUseSimplifiedContentMeasuring() && (itemLength == 1 || whitespaceContentIsTreatedAsSingleSpace);
auto width = simpleSingleWhitespaceContent ? std::make_optional(InlineLayoutUnit { fontCascade.spaceWidth() }) : inlineItemWidth(startPosition, itemLength);
- formattingState.addInlineItem(InlineTextItem::createWhitespaceItem(inlineTextBox, startPosition, itemLength, whitespaceContent->isWordSeparator, width));
+ formattingState.addInlineItem(InlineTextItem::createWhitespaceItem(inlineTextBox, startPosition, itemLength, UBIDI_DEFAULT_LTR, whitespaceContent->isWordSeparator, width));
};
if (style.whiteSpace() == WhiteSpace::BreakSpaces) {
// https://www.w3.org/TR/css-text-3/#white-space-phase-1
@@ -207,7 +207,7 @@
ASSERT(initialNonWhitespacePosition < currentPosition);
ASSERT_IMPLIES(style.hyphens() == Hyphens::None, !hasTrailingSoftHyphen);
auto length = currentPosition - initialNonWhitespacePosition;
- formattingState.addInlineItem(InlineTextItem::createNonWhitespaceItem(inlineTextBox, initialNonWhitespacePosition, length, hasTrailingSoftHyphen, inlineItemWidth(initialNonWhitespacePosition, length)));
+ formattingState.addInlineItem(InlineTextItem::createNonWhitespaceItem(inlineTextBox, initialNonWhitespacePosition, length, UBIDI_DEFAULT_LTR, hasTrailingSoftHyphen, inlineItemWidth(initialNonWhitespacePosition, length)));
}
}
}
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineSoftLineBreakItem.h (285078 => 285079)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineSoftLineBreakItem.h 2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineSoftLineBreakItem.h 2021-10-30 13:44:39 UTC (rev 285079)
@@ -34,21 +34,22 @@
class InlineSoftLineBreakItem : public InlineItem {
public:
- static InlineSoftLineBreakItem createSoftLineBreakItem(const InlineTextBox&, unsigned position);
+ static InlineSoftLineBreakItem createSoftLineBreakItem(const InlineTextBox&, unsigned position, UBiDiLevel = UBIDI_DEFAULT_LTR);
unsigned position() const { return m_startOrPosition; }
const InlineTextBox& inlineTextBox() const { return downcast<InlineTextBox>(layoutBox()); }
- InlineSoftLineBreakItem(const InlineTextBox&, unsigned position);
+private:
+ InlineSoftLineBreakItem(const InlineTextBox&, unsigned position, UBiDiLevel);
};
-inline InlineSoftLineBreakItem InlineSoftLineBreakItem::createSoftLineBreakItem(const InlineTextBox& inlineTextBox, unsigned position)
+inline InlineSoftLineBreakItem InlineSoftLineBreakItem::createSoftLineBreakItem(const InlineTextBox& inlineTextBox, unsigned position, UBiDiLevel bidiLevel)
{
- return { inlineTextBox, position };
+ return { inlineTextBox, position, bidiLevel };
}
-inline InlineSoftLineBreakItem::InlineSoftLineBreakItem(const InlineTextBox& inlineTextBox, unsigned position)
- : InlineItem(inlineTextBox, Type::SoftLineBreak)
+inline InlineSoftLineBreakItem::InlineSoftLineBreakItem(const InlineTextBox& inlineTextBox, unsigned position, UBiDiLevel bidiLevel)
+ : InlineItem(inlineTextBox, Type::SoftLineBreak, bidiLevel)
{
m_startOrPosition = position;
}
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.cpp (285078 => 285079)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.cpp 2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.cpp 2021-10-30 13:44:39 UTC (rev 285079)
@@ -38,8 +38,8 @@
static_assert(sizeof(InlineItem) == sizeof(InlineTextItem), "");
-InlineTextItem::InlineTextItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, bool hasTrailingSoftHyphen, bool isWordSeparator, std::optional<InlineLayoutUnit> width, TextItemType textItemType)
- : InlineItem(inlineTextBox, Type::Text)
+InlineTextItem::InlineTextItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, UBiDiLevel bidiLevel, bool hasTrailingSoftHyphen, bool isWordSeparator, std::optional<InlineLayoutUnit> width, TextItemType textItemType)
+ : InlineItem(inlineTextBox, Type::Text, bidiLevel)
{
m_startOrPosition = start;
m_length = length;
@@ -50,8 +50,8 @@
m_textItemType = textItemType;
}
-InlineTextItem::InlineTextItem(const InlineTextBox& inlineTextBox)
- : InlineItem(inlineTextBox, Type::Text)
+InlineTextItem::InlineTextItem(const InlineTextBox& inlineTextBox, UBiDiLevel bidiLevel)
+ : InlineItem(inlineTextBox, Type::Text, bidiLevel)
{
}
@@ -60,7 +60,7 @@
RELEASE_ASSERT(length <= this->length());
ASSERT(m_textItemType != TextItemType::Undefined);
ASSERT(length);
- return { inlineTextBox(), start(), length, false, isWordSeparator(), std::nullopt, m_textItemType };
+ return { inlineTextBox(), start(), length, bidiLevel(), false, isWordSeparator(), std::nullopt, m_textItemType };
}
InlineTextItem InlineTextItem::right(unsigned length, std::optional<InlineLayoutUnit> width) const
@@ -68,7 +68,7 @@
RELEASE_ASSERT(length <= this->length());
ASSERT(m_textItemType != TextItemType::Undefined);
ASSERT(length);
- return { inlineTextBox(), end() - length, length, hasTrailingSoftHyphen(), isWordSeparator(), width, m_textItemType };
+ return { inlineTextBox(), end() - length, length, bidiLevel(), hasTrailingSoftHyphen(), isWordSeparator(), width, m_textItemType };
}
bool InlineTextItem::isZeroWidthSpaceSeparator() const
Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.h (285078 => 285079)
--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.h 2021-10-30 06:48:10 UTC (rev 285078)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineTextItem.h 2021-10-30 13:44:39 UTC (rev 285079)
@@ -37,9 +37,9 @@
class InlineTextItem : public InlineItem {
public:
- static InlineTextItem createWhitespaceItem(const InlineTextBox&, unsigned start, unsigned length, bool isWordSeparator, std::optional<InlineLayoutUnit> width);
- static InlineTextItem createNonWhitespaceItem(const InlineTextBox&, unsigned start, unsigned length, bool hasTrailingSoftHyphen, std::optional<InlineLayoutUnit> width);
- static InlineTextItem createEmptyItem(const InlineTextBox&);
+ static InlineTextItem createWhitespaceItem(const InlineTextBox&, unsigned start, unsigned length, UBiDiLevel, bool isWordSeparator, std::optional<InlineLayoutUnit> width);
+ static InlineTextItem createNonWhitespaceItem(const InlineTextBox&, unsigned start, unsigned length, UBiDiLevel, bool hasTrailingSoftHyphen, std::optional<InlineLayoutUnit> width);
+ static InlineTextItem createEmptyItem(const InlineTextBox&, UBiDiLevel = UBIDI_DEFAULT_LTR);
unsigned start() const { return m_startOrPosition; }
unsigned end() const { return start() + length(); }
@@ -61,24 +61,24 @@
private:
using InlineItem::TextItemType;
- InlineTextItem(const InlineTextBox&, unsigned start, unsigned length, bool hasTrailingSoftHyphen, bool isWordSeparator, std::optional<InlineLayoutUnit> width, TextItemType);
- explicit InlineTextItem(const InlineTextBox&);
+ InlineTextItem(const InlineTextBox&, unsigned start, unsigned length, UBiDiLevel, bool hasTrailingSoftHyphen, bool isWordSeparator, std::optional<InlineLayoutUnit> width, TextItemType);
+ explicit InlineTextItem(const InlineTextBox&, UBiDiLevel);
};
-inline InlineTextItem InlineTextItem::createWhitespaceItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, bool isWordSeparator, std::optional<InlineLayoutUnit> width)
+inline InlineTextItem InlineTextItem::createWhitespaceItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, UBiDiLevel bidiLevel, bool isWordSeparator, std::optional<InlineLayoutUnit> width)
{
- return { inlineTextBox, start, length, false, isWordSeparator, width, TextItemType::Whitespace };
+ return { inlineTextBox, start, length, bidiLevel, false, isWordSeparator, width, TextItemType::Whitespace };
}
-inline InlineTextItem InlineTextItem::createNonWhitespaceItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, bool hasTrailingSoftHyphen, std::optional<InlineLayoutUnit> width)
+inline InlineTextItem InlineTextItem::createNonWhitespaceItem(const InlineTextBox& inlineTextBox, unsigned start, unsigned length, UBiDiLevel bidiLevel, bool hasTrailingSoftHyphen, std::optional<InlineLayoutUnit> width)
{
// FIXME: Use the following list of non-whitespace characters to set the "isWordSeparator" bit: noBreakSpace, ethiopicWordspace, aegeanWordSeparatorLine aegeanWordSeparatorDot ugariticWordDivider.
- return { inlineTextBox, start, length, hasTrailingSoftHyphen, false, width, TextItemType::NonWhitespace };
+ return { inlineTextBox, start, length, bidiLevel, hasTrailingSoftHyphen, false, width, TextItemType::NonWhitespace };
}
-inline InlineTextItem InlineTextItem::createEmptyItem(const InlineTextBox& inlineTextBox)
+inline InlineTextItem InlineTextItem::createEmptyItem(const InlineTextBox& inlineTextBox, UBiDiLevel bidiLevel)
{
- return InlineTextItem { inlineTextBox };
+ return InlineTextItem { inlineTextBox, bidiLevel };
}
}