layout: Fix ordering of padding, border, and margin in inline BiDi (#34572)

* [fix](inline flow): Create PBM items in inline context in propper visual order

Signed-off-by: Desiatkin Dmitrii <d.desyatkin@innopolis.university>

* Rename left/right pbm terms in inline layout to logical nomenclature

 - LineItem::LeftInlineBoxPaddingBorderMargin(_) is renamed to
   LineItem::InlineStartBoxPaddingBorderMargin(_)
 - LineItem::RightInlineBoxPaddingBorderMargin(_) is renamed to
   LineItem::InlineEndBoxPaddingBorderMargin(_)
 - LineLayoutInlineContainerFlags::HAD_LEFT_PBM is renamed to
   LineLayoutInlineContainerFlags::HAD_INLINE_START_PBM
 - LineLayoutInlineContainerFlags::HAD_RIGHT_PBM is renamed to
   LineLayoutInlineContainerFlags::HAD_INLINE_END_PBM

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

* Update test expectations

Signed-off-by: Oriol Brufau <obrufau@igalia.com>

---------

Signed-off-by: Desiatkin Dmitrii <d.desyatkin@innopolis.university>
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
Dmitrii Desiatkin 2024-12-12 22:39:50 +08:00 committed by GitHub
parent acf0074f8a
commit 5cb75a84a3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 29 additions and 52 deletions

View file

@ -49,10 +49,10 @@ bitflags! {
const HAD_ANY_LINE_ITEMS = 1 << 0;
/// Whether or not the starting inline border, padding, or margin of the inline box
/// was encountered.
const HAD_LEFT_PBM = 1 << 2;
const HAD_INLINE_START_PBM = 1 << 2;
/// Whether or not the ending inline border, padding, or margin of the inline box
/// was encountered.
const HAD_RIGHT_PBM = 1 << 3;
const HAD_INLINE_END_PBM = 1 << 3;
/// Whether or not any floats were encountered while laying out this inline box.
const HAD_ANY_FLOATS = 1 << 4;
}
@ -213,8 +213,8 @@ impl<'layout_data, 'layout> LineItemLayout<'layout_data, 'layout> {
// TODO: This level needs either to be last_level, or if there were
// unicode characters inserted for the inline box, we need to get the
// level from them.
LineItem::LeftInlineBoxPaddingBorderMargin(_) => last_level,
LineItem::RightInlineBoxPaddingBorderMargin(_) => last_level,
LineItem::InlineStartBoxPaddingBorderMargin(_) => last_level,
LineItem::InlineEndBoxPaddingBorderMargin(_) => last_level,
LineItem::Atomic(_, atomic) => atomic.bidi_level,
LineItem::AbsolutelyPositioned(..) => last_level,
LineItem::Float(..) => {
@ -261,15 +261,15 @@ impl<'layout_data, 'layout> LineItemLayout<'layout_data, 'layout> {
.flags
.insert(LineLayoutInlineContainerFlags::HAD_ANY_LINE_ITEMS);
match item {
LineItem::LeftInlineBoxPaddingBorderMargin(_) => {
LineItem::InlineStartBoxPaddingBorderMargin(_) => {
self.current_state
.flags
.insert(LineLayoutInlineContainerFlags::HAD_LEFT_PBM);
.insert(LineLayoutInlineContainerFlags::HAD_INLINE_START_PBM);
},
LineItem::RightInlineBoxPaddingBorderMargin(_) => {
LineItem::InlineEndBoxPaddingBorderMargin(_) => {
self.current_state
.flags
.insert(LineLayoutInlineContainerFlags::HAD_RIGHT_PBM);
.insert(LineLayoutInlineContainerFlags::HAD_INLINE_END_PBM);
},
LineItem::TextRun(_, text_run) => self.layout_text_run(text_run),
LineItem::Atomic(_, atomic) => self.layout_atomic(atomic),
@ -369,24 +369,19 @@ impl<'layout_data, 'layout> LineItemLayout<'layout_data, 'layout> {
let mut border = inline_box_state.pbm.border;
let mut margin = inline_box_state.pbm.margin.auto_is(Au::zero);
let had_left = inner_state
let mut had_start = inner_state
.flags
.contains(LineLayoutInlineContainerFlags::HAD_LEFT_PBM);
let had_right = inner_state
.contains(LineLayoutInlineContainerFlags::HAD_INLINE_START_PBM);
let mut had_end = inner_state
.flags
.contains(LineLayoutInlineContainerFlags::HAD_RIGHT_PBM);
.contains(LineLayoutInlineContainerFlags::HAD_INLINE_END_PBM);
let (had_start, had_end) = if self
.layout
.containing_block
.style
.writing_mode
.is_bidi_ltr()
let containing_block_writing_mode = self.layout.containing_block.style.writing_mode;
if containing_block_writing_mode.is_bidi_ltr() !=
inline_box.style.writing_mode.is_bidi_ltr()
{
(had_left, had_right)
} else {
(had_right, had_left)
};
std::mem::swap(&mut had_start, &mut had_end)
}
if !had_start {
padding.inline_start = Au::zero();
@ -718,8 +713,8 @@ impl<'layout_data, 'layout> LineItemLayout<'layout_data, 'layout> {
}
pub(super) enum LineItem {
LeftInlineBoxPaddingBorderMargin(InlineBoxIdentifier),
RightInlineBoxPaddingBorderMargin(InlineBoxIdentifier),
InlineStartBoxPaddingBorderMargin(InlineBoxIdentifier),
InlineEndBoxPaddingBorderMargin(InlineBoxIdentifier),
TextRun(Option<InlineBoxIdentifier>, TextRunLineItem),
Atomic(Option<InlineBoxIdentifier>, AtomicLineItem),
AbsolutelyPositioned(Option<InlineBoxIdentifier>, AbsolutelyPositionedLineItem),
@ -729,8 +724,8 @@ pub(super) enum LineItem {
impl LineItem {
fn inline_box_identifier(&self) -> Option<InlineBoxIdentifier> {
match self {
LineItem::LeftInlineBoxPaddingBorderMargin(identifier) => Some(*identifier),
LineItem::RightInlineBoxPaddingBorderMargin(identifier) => Some(*identifier),
LineItem::InlineStartBoxPaddingBorderMargin(identifier) => Some(*identifier),
LineItem::InlineEndBoxPaddingBorderMargin(identifier) => Some(*identifier),
LineItem::TextRun(identifier, _) => *identifier,
LineItem::Atomic(identifier, _) => *identifier,
LineItem::AbsolutelyPositioned(identifier, _) => *identifier,
@ -740,8 +735,8 @@ impl LineItem {
pub(super) fn trim_whitespace_at_end(&mut self, whitespace_trimmed: &mut Au) -> bool {
match self {
LineItem::LeftInlineBoxPaddingBorderMargin(_) => true,
LineItem::RightInlineBoxPaddingBorderMargin(_) => true,
LineItem::InlineStartBoxPaddingBorderMargin(_) => true,
LineItem::InlineEndBoxPaddingBorderMargin(_) => true,
LineItem::TextRun(_, ref mut item) => item.trim_whitespace_at_end(whitespace_trimmed),
LineItem::Atomic(..) => false,
LineItem::AbsolutelyPositioned(..) => true,
@ -751,8 +746,8 @@ impl LineItem {
pub(super) fn trim_whitespace_at_start(&mut self, whitespace_trimmed: &mut Au) -> bool {
match self {
LineItem::LeftInlineBoxPaddingBorderMargin(_) => true,
LineItem::RightInlineBoxPaddingBorderMargin(_) => true,
LineItem::InlineStartBoxPaddingBorderMargin(_) => true,
LineItem::InlineEndBoxPaddingBorderMargin(_) => true,
LineItem::TextRun(_, ref mut item) => item.trim_whitespace_at_start(whitespace_trimmed),
LineItem::Atomic(..) => false,
LineItem::AbsolutelyPositioned(..) => true,

View file

@ -48,8 +48,8 @@
//! a linear series of items that describe the line's hierarchy of inline boxes and content. The
//! item types are:
//!
//! - [`LineItem::LeftInlineBoxPaddingBorderMargin`]
//! - [`LineItem::RightInlineBoxPaddingBorderMargin`]
//! - [`LineItem::InlineStartBoxPaddingBorderMargin`]
//! - [`LineItem::InlineEndBoxPaddingBorderMargin`]
//! - [`LineItem::TextRun`]
//! - [`LineItem::Atomic`]
//! - [`LineItem::AbsolutelyPositioned`]
@ -733,7 +733,7 @@ impl<'layout_dta> InlineFormattingContextLayout<'layout_dta> {
inline_box_state.pbm.margin.inline_start.auto_is(Au::zero);
self.current_line_segment
.line_items
.push(LineItem::LeftInlineBoxPaddingBorderMargin(
.push(LineItem::InlineStartBoxPaddingBorderMargin(
inline_box.identifier,
));
}
@ -778,7 +778,7 @@ impl<'layout_dta> InlineFormattingContextLayout<'layout_dta> {
self.current_line_segment.inline_size += pbm_end;
self.current_line_segment
.line_items
.push(LineItem::RightInlineBoxPaddingBorderMargin(
.push(LineItem::InlineEndBoxPaddingBorderMargin(
inline_box_state.identifier,
))
}

View file

@ -1,2 +0,0 @@
[rtl-basic.xht]
expected: FAIL

View file

@ -1,2 +0,0 @@
[rtl-ib.xht]
expected: FAIL

View file

@ -1,2 +0,0 @@
[rtl-linebreak.xht]
expected: FAIL

View file

@ -1,2 +0,0 @@
[rtl-span-only-ib.xht]
expected: FAIL

View file

@ -1,2 +0,0 @@
[rtl-span-only.xht]
expected: FAIL

View file

@ -1,2 +0,0 @@
[block-in-inline-empty-002.xht]
expected: FAIL

View file

@ -1,2 +0,0 @@
[block-in-inline-empty-004.xht]
expected: FAIL

View file

@ -1,2 +0,0 @@
[emptyspan-2.html]
expected: FAIL

View file

@ -1,2 +0,0 @@
[emptyspan-4.html]
expected: FAIL