Add BoxFragment::is_inline_box() (#34233)

A helper function to check for inline boxes.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
Oriol Brufau 2024-11-12 16:50:20 +01:00 committed by GitHub
parent ae029242f8
commit bf75f17348
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 10 additions and 10 deletions

View file

@ -15,6 +15,7 @@ use style::Zero;
use super::{BaseFragment, BaseFragmentInfo, CollapsedBlockMargins, Fragment}; use super::{BaseFragment, BaseFragmentInfo, CollapsedBlockMargins, Fragment};
use crate::cell::ArcRefCell; use crate::cell::ArcRefCell;
use crate::formatting_contexts::Baselines; use crate::formatting_contexts::Baselines;
use crate::fragment_tree::FragmentFlags;
use crate::geom::{ use crate::geom::{
AuOrAuto, LengthPercentageOrAuto, PhysicalPoint, PhysicalRect, PhysicalSides, ToLogical, AuOrAuto, LengthPercentageOrAuto, PhysicalPoint, PhysicalRect, PhysicalSides, ToLogical,
}; };
@ -325,4 +326,11 @@ impl BoxFragment {
convert_to_au_or_auto(PhysicalSides::new(top, right, bottom, left)) convert_to_au_or_auto(PhysicalSides::new(top, right, bottom, left))
} }
/// Whether this is a non-replaced inline-level box whose inner display type is `flow`.
/// <https://drafts.csswg.org/css-display-3/#inline-box>
pub(crate) fn is_inline_box(&self) -> bool {
self.style.get_box().display.is_inline_flow() &&
!self.base.flags.contains(FragmentFlags::IS_REPLACED)
}
} }

View file

@ -16,7 +16,6 @@ use super::{ContainingBlockManager, Fragment, Tag};
use crate::cell::ArcRefCell; use crate::cell::ArcRefCell;
use crate::display_list::StackingContext; use crate::display_list::StackingContext;
use crate::flow::CanvasBackground; use crate::flow::CanvasBackground;
use crate::fragment_tree::FragmentFlags;
use crate::geom::PhysicalRect; use crate::geom::PhysicalRect;
#[derive(Serialize)] #[derive(Serialize)]
@ -141,9 +140,7 @@ impl FragmentTree {
// CSS layout box is inline, return zero." For this check we // CSS layout box is inline, return zero." For this check we
// also explicitly ignore the list item portion of the display // also explicitly ignore the list item portion of the display
// style. // style.
if fragment.style.get_box().display.is_inline_flow() && if fragment.is_inline_box() {
!fragment.base.flags.contains(FragmentFlags::IS_REPLACED)
{
return Some(Rect::zero()); return Some(Rect::zero());
} }

View file

@ -248,12 +248,7 @@ fn resolved_size_should_be_used_value(fragment: &Fragment) -> bool {
// https://drafts.csswg.org/css-sizing-3/#preferred-size-properties // https://drafts.csswg.org/css-sizing-3/#preferred-size-properties
// > Applies to: all elements except non-replaced inlines // > Applies to: all elements except non-replaced inlines
match fragment { match fragment {
Fragment::Box(box_fragment) => { Fragment::Box(box_fragment) => !box_fragment.is_inline_box(),
!box_fragment.style.get_box().display.is_inline_flow() ||
fragment
.base()
.is_some_and(|base| base.flags.contains(FragmentFlags::IS_REPLACED))
},
Fragment::Float(_) | Fragment::Float(_) |
Fragment::Positioning(_) | Fragment::Positioning(_) |
Fragment::AbsoluteOrFixedPositioned(_) | Fragment::AbsoluteOrFixedPositioned(_) |