diff --git a/components/layout/inline.rs b/components/layout/inline.rs index f0d80bdbc82..c112a8acdc5 100644 --- a/components/layout/inline.rs +++ b/components/layout/inline.rs @@ -1760,7 +1760,10 @@ impl Flow for InlineFlow { first_fragment.style.logical_border_width()) .start; containing_block_positions.push( - padding_box_origin.to_physical(self.base.writing_mode, container_size), + // TODO(servo#30577) revert once underlying bug is fixed + // padding_box_origin.to_physical(self.base.writing_mode, container_size), + padding_box_origin + .to_physical_or_warn(self.base.writing_mode, container_size), ); }, SpecificFragmentInfo::InlineBlock(_) if fragment.is_positioned() => { diff --git a/components/style/logical_geometry.rs b/components/style/logical_geometry.rs index 2b73faa355a..9a823a5a24a 100644 --- a/components/style/logical_geometry.rs +++ b/components/style/logical_geometry.rs @@ -771,6 +771,38 @@ impl> LogicalPoint { } } + // TODO(servo#30577) remove this once underlying bugs are fixed + #[inline] + pub fn to_physical_or_warn(&self, mode: WritingMode, container_size: Size2D) -> Point2D { + #[cfg(debug_assertions)] + if !(self.debug_writing_mode.mode == mode) { + log::warn!("debug assertion failed! self.debug_writing_mode.mode == mode"); + } + if mode.is_vertical() { + Point2D::new( + if mode.is_vertical_lr() { + self.b + } else { + container_size.width - self.b + }, + if mode.is_inline_tb() { + self.i + } else { + container_size.height - self.i + }, + ) + } else { + Point2D::new( + if mode.is_bidi_ltr() { + self.i + } else { + container_size.width - self.i + }, + self.b, + ) + } + } + #[inline] pub fn convert( &self,