aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/block.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout/block.rs')
-rw-r--r--components/layout/block.rs27
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));
}