From 22ea9a634c767c09e6299495a1969fa8991d9dc2 Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Tue, 17 Jun 2014 14:53:42 -0700 Subject: [PATCH] Add overflow to child layer size When creating child layers it is important to consider overflow when determining the size of the layer. This also means that overflow should not be too large, so also shrink block width down to the size of their contained fragment. This means that a block that has been explicitly sized to width:100px should be 100 pixels wide instead of the width of its containing block. --- src/components/main/layout/block.rs | 35 ++++++++++++++------- src/test/ref/basic.list | 1 + src/test/ref/position_fixed_overflow_a.html | 8 +++++ src/test/ref/position_fixed_overflow_b.html | 6 ++++ 4 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 src/test/ref/position_fixed_overflow_a.html create mode 100644 src/test/ref/position_fixed_overflow_b.html diff --git a/src/components/main/layout/block.rs b/src/components/main/layout/block.rs index 99bb0e076a8..d280e713ee1 100644 --- a/src/components/main/layout/block.rs +++ b/src/components/main/layout/block.rs @@ -1256,10 +1256,11 @@ impl BlockFlow { } // If we got here, then we need a new layer. - let size = Size2D(self.base.position.size.width.to_nearest_px() as uint, - self.base.position.size.height.to_nearest_px() as uint); - let origin = Point2D(self.base.abs_position.x.to_nearest_px() as uint, - self.base.abs_position.y.to_nearest_px() as uint); + let layer_rect = self.base.position.union(&self.base.overflow); + let size = Size2D(layer_rect.size.width.to_nearest_px() as uint, + layer_rect.size.height.to_nearest_px() as uint); + let origin = Point2D(layer_rect.origin.x.to_nearest_px() as uint, + layer_rect.origin.y.to_nearest_px() as uint); let scroll_policy = if self.is_fixed() { FixedPosition } else { @@ -1814,15 +1815,25 @@ pub trait WidthAndMarginsComputer { fn set_width_constraint_solutions(&self, block: &mut BlockFlow, solution: WidthConstraintSolution) { - let fragment = block.fragment(); - fragment.margin.left = solution.margin_left; - fragment.margin.right = solution.margin_right; + let mut width = Au(0); + { + let fragment = block.fragment(); + fragment.margin.left = solution.margin_left; + fragment.margin.right = solution.margin_right; - // The associated fragment has the border box of this flow. - // Left border edge. - fragment.border_box.origin.x = fragment.margin.left; - // Border box width. - fragment.border_box.size.width = solution.width + fragment.border_padding.horizontal(); + // The associated fragment has the border box of this flow. + // Left border edge. + fragment.border_box.origin.x = fragment.margin.left; + // Border box width. + width = solution.width + fragment.border_padding.horizontal(); + fragment.border_box.size.width = width; + } + + // We also resize the block itself, to ensure that overflow is not calculated + // as the width of our parent. We might be smaller and we might be larger if we + // overflow. + let flow = flow::mut_base(block); + flow.position.size.width = width; } /// Set the x coordinate of the given flow if it is absolutely positioned. diff --git a/src/test/ref/basic.list b/src/test/ref/basic.list index fe430010bd1..1b86220be0d 100644 --- a/src/test/ref/basic.list +++ b/src/test/ref/basic.list @@ -77,3 +77,4 @@ == linebreak_inline_span_a.html linebreak_inline_span_b.html == overconstrained_block.html overconstrained_block_ref.html == position_fixed_background_color_a.html position_fixed_background_color_b.html +== position_fixed_overflow_a.html position_fixed_overflow_b.html diff --git a/src/test/ref/position_fixed_overflow_a.html b/src/test/ref/position_fixed_overflow_a.html new file mode 100644 index 00000000000..edc21e7d347 --- /dev/null +++ b/src/test/ref/position_fixed_overflow_a.html @@ -0,0 +1,8 @@ + + +
+
+
+ + + diff --git a/src/test/ref/position_fixed_overflow_b.html b/src/test/ref/position_fixed_overflow_b.html new file mode 100644 index 00000000000..a8947566153 --- /dev/null +++ b/src/test/ref/position_fixed_overflow_b.html @@ -0,0 +1,6 @@ + + +
+ + +