mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
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:
parent
acf0074f8a
commit
5cb75a84a3
11 changed files with 29 additions and 52 deletions
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
))
|
||||
}
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
[rtl-basic.xht]
|
||||
expected: FAIL
|
2
tests/wpt/meta/css/CSS2/box/rtl-ib.xht.ini
vendored
2
tests/wpt/meta/css/CSS2/box/rtl-ib.xht.ini
vendored
|
@ -1,2 +0,0 @@
|
|||
[rtl-ib.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[rtl-linebreak.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[rtl-span-only-ib.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[rtl-span-only.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[block-in-inline-empty-002.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[block-in-inline-empty-004.xht]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[emptyspan-2.html]
|
||||
expected: FAIL
|
|
@ -1,2 +0,0 @@
|
|||
[emptyspan-4.html]
|
||||
expected: FAIL
|
Loading…
Add table
Add a link
Reference in a new issue