aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/fragment_tree/fragment.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_2020/fragment_tree/fragment.rs')
-rw-r--r--components/layout_2020/fragment_tree/fragment.rs69
1 files changed, 36 insertions, 33 deletions
diff --git a/components/layout_2020/fragment_tree/fragment.rs b/components/layout_2020/fragment_tree/fragment.rs
index 69e87df1e11..5c8b86d455b 100644
--- a/components/layout_2020/fragment_tree/fragment.rs
+++ b/components/layout_2020/fragment_tree/fragment.rs
@@ -23,16 +23,16 @@ use crate::cell::ArcRefCell;
use crate::geom::{LogicalSides, PhysicalRect};
use crate::style_ext::ComputedValuesExt;
-#[derive(Serialize)]
+#[derive(Clone, Serialize)]
pub(crate) enum Fragment {
- Box(BoxFragment),
+ Box(ArcRefCell<BoxFragment>),
/// Floating content. A floated fragment is very similar to a normal
/// [BoxFragment] but it isn't positioned using normal in block flow
/// positioning rules (margin collapse, etc). Instead, they are laid
/// out by the [crate::flow::float::SequentialLayoutState] of their
/// float containing block formatting context.
- Float(BoxFragment),
- Positioning(PositioningFragment),
+ Float(ArcRefCell<BoxFragment>),
+ Positioning(ArcRefCell<PositioningFragment>),
/// Absolute and fixed position fragments are hoisted up so that they
/// are children of the BoxFragment that establishes their containing
/// blocks, so that they can be laid out properly. When this happens
@@ -41,9 +41,9 @@ pub(crate) enum Fragment {
/// regard to their original tree order during stacking context tree /
/// display list construction.
AbsoluteOrFixedPositioned(ArcRefCell<HoistedSharedFragment>),
- Text(TextFragment),
- Image(ImageFragment),
- IFrame(IFrameFragment),
+ Text(ArcRefCell<TextFragment>),
+ Image(ArcRefCell<ImageFragment>),
+ IFrame(ArcRefCell<IFrameFragment>),
}
#[derive(Serialize)]
@@ -99,26 +99,26 @@ pub(crate) struct IFrameFragment {
}
impl Fragment {
- pub fn base(&self) -> Option<&BaseFragment> {
+ pub fn base(&self) -> Option<BaseFragment> {
Some(match self {
- Fragment::Box(fragment) => &fragment.base,
- Fragment::Text(fragment) => &fragment.base,
+ Fragment::Box(fragment) => fragment.borrow().base.clone(),
+ Fragment::Text(fragment) => fragment.borrow().base.clone(),
Fragment::AbsoluteOrFixedPositioned(_) => return None,
- Fragment::Positioning(fragment) => &fragment.base,
- Fragment::Image(fragment) => &fragment.base,
- Fragment::IFrame(fragment) => &fragment.base,
- Fragment::Float(fragment) => &fragment.base,
+ Fragment::Positioning(fragment) => fragment.borrow().base.clone(),
+ Fragment::Image(fragment) => fragment.borrow().base.clone(),
+ Fragment::IFrame(fragment) => fragment.borrow().base.clone(),
+ Fragment::Float(fragment) => fragment.borrow().base.clone(),
})
}
- pub(crate) fn content_rect_mut(&mut self) -> Option<&mut PhysicalRect<Au>> {
+ pub(crate) fn mutate_content_rect(&mut self, callback: impl FnOnce(&mut PhysicalRect<Au>)) {
match self {
Fragment::Box(box_fragment) | Fragment::Float(box_fragment) => {
- Some(&mut box_fragment.content_rect)
+ callback(&mut box_fragment.borrow_mut().content_rect)
},
- Fragment::Positioning(_) | Fragment::AbsoluteOrFixedPositioned(_) => None,
- Fragment::Text(text_fragment) => Some(&mut text_fragment.rect),
- Fragment::Image(image_fragment) => Some(&mut image_fragment.rect),
- Fragment::IFrame(iframe_fragment) => Some(&mut iframe_fragment.rect),
+ Fragment::Positioning(_) | Fragment::AbsoluteOrFixedPositioned(_) => {},
+ Fragment::Text(text_fragment) => callback(&mut text_fragment.borrow_mut().rect),
+ Fragment::Image(image_fragment) => callback(&mut image_fragment.borrow_mut().rect),
+ Fragment::IFrame(iframe_fragment) => callback(&mut iframe_fragment.borrow_mut().rect),
}
}
@@ -128,25 +128,26 @@ impl Fragment {
pub fn print(&self, tree: &mut PrintTree) {
match self {
- Fragment::Box(fragment) => fragment.print(tree),
+ Fragment::Box(fragment) => fragment.borrow().print(tree),
Fragment::Float(fragment) => {
tree.new_level("Float".to_string());
- fragment.print(tree);
+ fragment.borrow().print(tree);
tree.end_level();
},
Fragment::AbsoluteOrFixedPositioned(_) => {
tree.add_item("AbsoluteOrFixedPositioned".to_string());
},
- Fragment::Positioning(fragment) => fragment.print(tree),
- Fragment::Text(fragment) => fragment.print(tree),
- Fragment::Image(fragment) => fragment.print(tree),
- Fragment::IFrame(fragment) => fragment.print(tree),
+ Fragment::Positioning(fragment) => fragment.borrow().print(tree),
+ Fragment::Text(fragment) => fragment.borrow().print(tree),
+ Fragment::Image(fragment) => fragment.borrow().print(tree),
+ Fragment::IFrame(fragment) => fragment.borrow().print(tree),
}
}
pub fn scrolling_area(&self, containing_block: &PhysicalRect<Au>) -> PhysicalRect<Au> {
match self {
Fragment::Box(fragment) | Fragment::Float(fragment) => fragment
+ .borrow()
.scrollable_overflow()
.translate(containing_block.origin.to_vector()),
_ => self.scrollable_overflow(),
@@ -156,13 +157,13 @@ impl Fragment {
pub fn scrollable_overflow(&self) -> PhysicalRect<Au> {
match self {
Fragment::Box(fragment) | Fragment::Float(fragment) => {
- fragment.scrollable_overflow_for_parent()
+ fragment.borrow().scrollable_overflow_for_parent()
},
Fragment::AbsoluteOrFixedPositioned(_) => PhysicalRect::zero(),
- Fragment::Positioning(fragment) => fragment.scrollable_overflow,
- Fragment::Text(fragment) => fragment.rect,
- Fragment::Image(fragment) => fragment.rect,
- Fragment::IFrame(fragment) => fragment.rect,
+ Fragment::Positioning(fragment) => fragment.borrow().scrollable_overflow,
+ Fragment::Text(fragment) => fragment.borrow().rect,
+ Fragment::Image(fragment) => fragment.borrow().rect,
+ Fragment::IFrame(fragment) => fragment.borrow().rect,
}
}
@@ -179,6 +180,7 @@ impl Fragment {
match self {
Fragment::Box(fragment) | Fragment::Float(fragment) => {
+ let fragment = fragment.borrow();
let content_rect = fragment
.content_rect
.translate(containing_block.origin.to_vector());
@@ -202,15 +204,16 @@ impl Fragment {
fragment
.children
.iter()
- .find_map(|child| child.borrow().find(&new_manager, level + 1, process_func))
+ .find_map(|child| child.find(&new_manager, level + 1, process_func))
},
Fragment::Positioning(fragment) => {
+ let fragment = fragment.borrow();
let content_rect = fragment.rect.translate(containing_block.origin.to_vector());
let new_manager = manager.new_for_non_absolute_descendants(&content_rect);
fragment
.children
.iter()
- .find_map(|child| child.borrow().find(&new_manager, level + 1, process_func))
+ .find_map(|child| child.find(&new_manager, level + 1, process_func))
},
_ => None,
}