mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
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.
This commit is contained in:
parent
897e39dcf3
commit
22ea9a634c
4 changed files with 38 additions and 12 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
8
src/test/ref/position_fixed_overflow_a.html
Normal file
8
src/test/ref/position_fixed_overflow_a.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
<html>
|
||||
<body>
|
||||
<div style="top: 5px; left: 5px; height: 5px; width: 5px; position: fixed;">
|
||||
<div style="height: 100px; width: 100px; background: black;"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
6
src/test/ref/position_fixed_overflow_b.html
Normal file
6
src/test/ref/position_fixed_overflow_b.html
Normal file
|
@ -0,0 +1,6 @@
|
|||
<html>
|
||||
<body>
|
||||
<div style="top: 5px; left: 5px; height: 100px; width: 100px; position: absolute; background: black;"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue