aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_2020/flow/mod.rs')
-rw-r--r--components/layout_2020/flow/mod.rs83
1 files changed, 26 insertions, 57 deletions
diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs
index 82d4fa2efc9..7ccb092374b 100644
--- a/components/layout_2020/flow/mod.rs
+++ b/components/layout_2020/flow/mod.rs
@@ -4,8 +4,6 @@
//! Flow layout, also known as block-and-inline layout.
-use std::ops::DerefMut;
-
use crate::cell::ArcRefCell;
use crate::context::LayoutContext;
use crate::flow::float::{ClearSide, ContainingBlockPositionInfo, FloatBox, SequentialLayoutState};
@@ -299,7 +297,7 @@ fn layout_block_level_children_in_parallel(
let fragments = layout_results
.into_iter()
.map(|(mut fragment, mut child_positioning_context)| {
- placement_state.place_fragment(&mut fragment);
+ placement_state.place_fragment(&mut fragment, None);
child_positioning_context.adjust_static_position_of_hoisted_fragments(&fragment);
positioning_context.append(child_positioning_context);
fragment
@@ -341,9 +339,7 @@ fn layout_block_level_children_sequentially(
Some(&mut *sequential_layout_state),
);
- placement_state.place_fragment(&mut fragment);
- placement_state
- .adjust_positions_of_float_children(&mut fragment, sequential_layout_state);
+ placement_state.place_fragment(&mut fragment, Some(sequential_layout_state));
child_positioning_context.adjust_static_position_of_hoisted_fragments(&fragment);
positioning_context.append(child_positioning_context);
fragment
@@ -796,7 +792,11 @@ impl PlacementState {
}
}
- fn place_fragment(&mut self, fragment: &mut Fragment) {
+ fn place_fragment(
+ &mut self,
+ fragment: &mut Fragment,
+ sequential_layout_state: Option<&mut SequentialLayoutState>,
+ ) {
match fragment {
Fragment::Box(fragment) => {
let fragment_block_margins = &fragment.block_margins_collapsed_with_children;
@@ -855,7 +855,25 @@ impl PlacementState {
};
fragment.borrow_mut().adjust_offsets(offset);
},
- Fragment::Anonymous(_) | Fragment::Float(_) => {},
+ Fragment::Float(box_fragment) => {
+ // When Float fragments are created in block flows, they are positioned
+ // relative to the float containing independent block formatting context.
+ // Once we place a float's containing block, this function can be used to
+ // fix up the float position to be relative to the containing block.
+ let sequential_layout_state = sequential_layout_state
+ .expect("Found float fragment without SequentialLayoutState");
+ let containing_block_info = &sequential_layout_state.floats.containing_block_info;
+ let margin = containing_block_info
+ .block_start_margins_not_collapsed
+ .adjoin(&self.start_margin);
+ let parent_fragment_offset_in_formatting_context = Vec2 {
+ inline: containing_block_info.inline_start,
+ block: containing_block_info.block_start + margin.solve(),
+ };
+ box_fragment.content_rect.start_corner = &box_fragment.content_rect.start_corner -
+ &parent_fragment_offset_in_formatting_context;
+ },
+ Fragment::Anonymous(_) => {},
_ => unreachable!(),
}
}
@@ -874,53 +892,4 @@ impl PlacementState {
},
)
}
-
- /// When Float fragments are created in block flows, they are positioned
- /// relative to the float containing independent block formatting context.
- /// Once we place a float's containing block, this function can be used to
- /// fix up the float position to be relative to the containing block.
- fn adjust_positions_of_float_children(
- &self,
- fragment: &mut Fragment,
- sequential_layout_state: &mut SequentialLayoutState,
- ) {
- let fragment = match fragment {
- Fragment::Box(ref mut fragment) => fragment,
- _ => return,
- };
-
- // TODO(mrobinson): Will these margins be accurate if this fragment
- // collapses through. Can a fragment collapse through when it has a
- // non-zero sized float inside? The float won't be positioned correctly
- // anyway (see the comment in `floats.rs` about margin collapse), but
- // this might make the result even worse.
- let collapsed_margins = self.start_margin.adjoin(
- &sequential_layout_state
- .floats
- .containing_block_info
- .block_start_margins_not_collapsed,
- );
-
- let parent_fragment_offset_in_cb = &fragment.content_rect.start_corner;
- let parent_fragment_offset_in_formatting_context = Vec2 {
- inline: sequential_layout_state
- .floats
- .containing_block_info
- .inline_start +
- parent_fragment_offset_in_cb.inline,
- block: sequential_layout_state
- .floats
- .containing_block_info
- .block_start +
- collapsed_margins.solve() +
- parent_fragment_offset_in_cb.block,
- };
-
- for child_fragment in fragment.children.iter_mut() {
- if let Fragment::Float(box_fragment) = child_fragment.borrow_mut().deref_mut() {
- box_fragment.content_rect.start_corner = &box_fragment.content_rect.start_corner -
- &parent_fragment_offset_in_formatting_context;
- }
- }
- }
}