diff options
Diffstat (limited to 'components/layout/block.rs')
-rw-r--r-- | components/layout/block.rs | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/components/layout/block.rs b/components/layout/block.rs index c21d3123bc7..718155f495b 100644 --- a/components/layout/block.rs +++ b/components/layout/block.rs @@ -933,7 +933,7 @@ impl BlockFlow { if is_root { let screen_size = LogicalSize::from_physical(self.fragment.style.writing_mode, layout_context.shared.screen_size); - block_size = Au::max(screen_size.block, block_size) + block_size = max(screen_size.block, block_size) } if is_root || self.formatting_context_type() != FormattingContextType::None || @@ -1395,9 +1395,7 @@ impl BlockFlow { } let info = PlacementInfo { - size: LogicalSize::new(self.fragment.style.writing_mode, - self.base.position.size.inline, - self.fragment.border_box.size.block), + size: self.fragment.border_box.size, ceiling: self.base.position.start.b, max_inline_size: MAX_AU, kind: FloatKind::Left, @@ -1467,8 +1465,8 @@ impl Flow for BlockFlow { // Find the maximum inline-size from children. let mut computation = self.fragment.compute_intrinsic_inline_sizes(); - let mut left_float_width = Au(0); - let mut right_float_width = Au(0); + let (mut left_float_width, mut right_float_width) = (Au(0), Au(0)); + let (mut left_float_width_accumulator, mut right_float_width_accumulator) = (Au(0), Au(0)); for kid in self.base.child_iter() { let is_absolutely_positioned = flow::base(kid).flags.contains(IS_ABSOLUTELY_POSITIONED); @@ -1479,6 +1477,15 @@ impl Flow for BlockFlow { max(computation.content_intrinsic_sizes.minimum_inline_size, child_base.intrinsic_inline_sizes.minimum_inline_size); + if child_base.flags.contains(CLEARS_LEFT) { + left_float_width = max(left_float_width, left_float_width_accumulator); + left_float_width_accumulator = Au(0) + } + if child_base.flags.contains(CLEARS_RIGHT) { + right_float_width = max(right_float_width, right_float_width_accumulator); + right_float_width_accumulator = Au(0) + } + match float_kind { float::T::none => { computation.content_intrinsic_sizes.preferred_inline_size = @@ -1486,11 +1493,11 @@ impl Flow for BlockFlow { child_base.intrinsic_inline_sizes.preferred_inline_size); } float::T::left => { - left_float_width = left_float_width + + left_float_width_accumulator = left_float_width_accumulator + child_base.intrinsic_inline_sizes.preferred_inline_size; } float::T::right => { - right_float_width = right_float_width + + right_float_width_accumulator = right_float_width_accumulator + child_base.intrinsic_inline_sizes.preferred_inline_size; } } @@ -1502,6 +1509,8 @@ impl Flow for BlockFlow { // FIXME(pcwalton): This should consider all float descendants, not just children. // FIXME(pcwalton): This is not well-spec'd; INTRINSIC specifies to do this, but CSS-SIZING // says not to. In practice, Gecko and WebKit both do this. + left_float_width = max(left_float_width, left_float_width_accumulator); + right_float_width = max(right_float_width, right_float_width_accumulator); computation.content_intrinsic_sizes.preferred_inline_size = max(computation.content_intrinsic_sizes.preferred_inline_size, left_float_width + right_float_width); @@ -1914,7 +1923,7 @@ impl Flow for BlockFlow { self.base .absolute_position_info .relative_containing_block_mode, - CoordinateSystem::Parent) + CoordinateSystem::Own) .translate(stacking_context_position)); } |