mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
layout: Implement node geometry queries against BoxTree
's Fragment
(#36663)
This is a followup to #36629, continuing to implement script-based layout queries using the `Fragment`s attached to the `BoxTree`. In this change, geometry queris (apart from parent offset) are calculated using `Fragment`s hanging of the `BoxTree`. In order to make this work, all `Fragment`s for inlines split by blocks, need to be accessible in the `BoxTree`. This required some changes to the way that box tree items were stored in DOM `BoxSlot`s. Now every inline level item can have more than a single `BoxTree` item. These are carefully collected by the `InlineFormattingContextBuilder` -- currently a bit fragile, but with more documentation. Testing: There are tests for these changes. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
parent
cc91395397
commit
b63a1818c4
13 changed files with 197 additions and 170 deletions
|
@ -23,8 +23,12 @@ pub(crate) struct InlineBox {
|
|||
pub base: LayoutBoxBase,
|
||||
/// The identifier of this inline box in the containing [`super::InlineFormattingContext`].
|
||||
pub(super) identifier: InlineBoxIdentifier,
|
||||
pub is_first_fragment: bool,
|
||||
pub is_last_fragment: bool,
|
||||
/// Whether or not this is the first instance of an [`InlineBox`] before a possible
|
||||
/// block-in-inline split. When no split occurs, this is always true.
|
||||
pub is_first_split: bool,
|
||||
/// Whether or not this is the last instance of an [`InlineBox`] before a possible
|
||||
/// block-in-inline split. When no split occurs, this is always true.
|
||||
pub is_last_split: bool,
|
||||
/// The index of the default font in the [`super::InlineFormattingContext`]'s font metrics store.
|
||||
/// This is initialized during IFC shaping.
|
||||
pub default_font_index: Option<usize>,
|
||||
|
@ -36,8 +40,8 @@ impl InlineBox {
|
|||
base: LayoutBoxBase::new(info.into(), info.style.clone()),
|
||||
// This will be assigned later, when the box is actually added to the IFC.
|
||||
identifier: InlineBoxIdentifier::default(),
|
||||
is_first_fragment: true,
|
||||
is_last_fragment: false,
|
||||
is_first_split: true,
|
||||
is_last_split: false,
|
||||
default_font_index: None,
|
||||
}
|
||||
}
|
||||
|
@ -45,8 +49,8 @@ impl InlineBox {
|
|||
pub(crate) fn split_around_block(&self) -> Self {
|
||||
Self {
|
||||
base: LayoutBoxBase::new(self.base.base_fragment_info, self.base.style.clone()),
|
||||
is_first_fragment: false,
|
||||
is_last_fragment: false,
|
||||
is_first_split: false,
|
||||
is_last_split: false,
|
||||
..*self
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue