From 5cb75a84a35effcbdd18fb61c7a557a9587745fd Mon Sep 17 00:00:00 2001 From: Dmitrii Desiatkin <47791504+d-desiatkin@users.noreply.github.com> Date: Thu, 12 Dec 2024 22:39:50 +0800 Subject: [PATCH] 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 * 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 * Update test expectations Signed-off-by: Oriol Brufau --------- Signed-off-by: Desiatkin Dmitrii Signed-off-by: Oriol Brufau Co-authored-by: Oriol Brufau --- components/layout_2020/flow/inline/line.rs | 55 +++++++++---------- components/layout_2020/flow/inline/mod.rs | 8 +-- tests/wpt/meta/css/CSS2/box/rtl-basic.xht.ini | 2 - tests/wpt/meta/css/CSS2/box/rtl-ib.xht.ini | 2 - .../meta/css/CSS2/box/rtl-linebreak.xht.ini | 2 - .../css/CSS2/box/rtl-span-only-ib.xht.ini | 2 - .../meta/css/CSS2/box/rtl-span-only.xht.ini | 2 - .../block-in-inline-empty-002.xht.ini | 2 - .../block-in-inline-empty-004.xht.ini | 2 - .../css/CSS2/visuren/emptyspan-2.html.ini | 2 - .../css/CSS2/visuren/emptyspan-4.html.ini | 2 - 11 files changed, 29 insertions(+), 52 deletions(-) delete mode 100644 tests/wpt/meta/css/CSS2/box/rtl-basic.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/box/rtl-ib.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/box/rtl-linebreak.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/box/rtl-span-only-ib.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/box/rtl-span-only.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/normal-flow/block-in-inline-empty-002.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/normal-flow/block-in-inline-empty-004.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/visuren/emptyspan-2.html.ini delete mode 100644 tests/wpt/meta/css/CSS2/visuren/emptyspan-4.html.ini diff --git a/components/layout_2020/flow/inline/line.rs b/components/layout_2020/flow/inline/line.rs index a0836c30ea9..ed86cf54a54 100644 --- a/components/layout_2020/flow/inline/line.rs +++ b/components/layout_2020/flow/inline/line.rs @@ -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, TextRunLineItem), Atomic(Option, AtomicLineItem), AbsolutelyPositioned(Option, AbsolutelyPositionedLineItem), @@ -729,8 +724,8 @@ pub(super) enum LineItem { impl LineItem { fn inline_box_identifier(&self) -> Option { 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, diff --git a/components/layout_2020/flow/inline/mod.rs b/components/layout_2020/flow/inline/mod.rs index 6fde268818e..2bf8732f85e 100644 --- a/components/layout_2020/flow/inline/mod.rs +++ b/components/layout_2020/flow/inline/mod.rs @@ -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, )) } diff --git a/tests/wpt/meta/css/CSS2/box/rtl-basic.xht.ini b/tests/wpt/meta/css/CSS2/box/rtl-basic.xht.ini deleted file mode 100644 index 72813086012..00000000000 --- a/tests/wpt/meta/css/CSS2/box/rtl-basic.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[rtl-basic.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/box/rtl-ib.xht.ini b/tests/wpt/meta/css/CSS2/box/rtl-ib.xht.ini deleted file mode 100644 index a6194bb0dce..00000000000 --- a/tests/wpt/meta/css/CSS2/box/rtl-ib.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[rtl-ib.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/box/rtl-linebreak.xht.ini b/tests/wpt/meta/css/CSS2/box/rtl-linebreak.xht.ini deleted file mode 100644 index 76072232847..00000000000 --- a/tests/wpt/meta/css/CSS2/box/rtl-linebreak.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[rtl-linebreak.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/box/rtl-span-only-ib.xht.ini b/tests/wpt/meta/css/CSS2/box/rtl-span-only-ib.xht.ini deleted file mode 100644 index 37125c29449..00000000000 --- a/tests/wpt/meta/css/CSS2/box/rtl-span-only-ib.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[rtl-span-only-ib.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/box/rtl-span-only.xht.ini b/tests/wpt/meta/css/CSS2/box/rtl-span-only.xht.ini deleted file mode 100644 index 6fe3e636065..00000000000 --- a/tests/wpt/meta/css/CSS2/box/rtl-span-only.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[rtl-span-only.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/normal-flow/block-in-inline-empty-002.xht.ini b/tests/wpt/meta/css/CSS2/normal-flow/block-in-inline-empty-002.xht.ini deleted file mode 100644 index 75f6245abb9..00000000000 --- a/tests/wpt/meta/css/CSS2/normal-flow/block-in-inline-empty-002.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[block-in-inline-empty-002.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/normal-flow/block-in-inline-empty-004.xht.ini b/tests/wpt/meta/css/CSS2/normal-flow/block-in-inline-empty-004.xht.ini deleted file mode 100644 index 9091bfed9e8..00000000000 --- a/tests/wpt/meta/css/CSS2/normal-flow/block-in-inline-empty-004.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[block-in-inline-empty-004.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/visuren/emptyspan-2.html.ini b/tests/wpt/meta/css/CSS2/visuren/emptyspan-2.html.ini deleted file mode 100644 index 66eef896c29..00000000000 --- a/tests/wpt/meta/css/CSS2/visuren/emptyspan-2.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[emptyspan-2.html] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/visuren/emptyspan-4.html.ini b/tests/wpt/meta/css/CSS2/visuren/emptyspan-4.html.ini deleted file mode 100644 index 2988794a37d..00000000000 --- a/tests/wpt/meta/css/CSS2/visuren/emptyspan-4.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[emptyspan-4.html] - expected: FAIL