layout: Fix percentages in relatively positioned elements

This commit is contained in:
Patrick Walton 2014-03-31 19:26:56 -07:00
parent 2e5b210c95
commit aabda89a90
4 changed files with 12 additions and 11 deletions

View file

@ -1171,7 +1171,7 @@ impl BlockFlow {
let mut info = *info; let mut info = *info;
let mut rel_offset = Point2D(Au(0), Au(0)); let mut rel_offset = Point2D(Au(0), Au(0));
for fragment in self.box_.iter() { for fragment in self.box_.iter() {
rel_offset = fragment.relative_position(&info.containing_block_size); rel_offset = fragment.relative_position(&info.relative_containing_block_size);
// Add the box that starts the block context. // Add the box that starts the block context.
fragment.build_display_list(stacking_context, fragment.build_display_list(stacking_context,
@ -1184,11 +1184,12 @@ impl BlockFlow {
// For relatively-positioned descendants, the containing block formed by a block is // For relatively-positioned descendants, the containing block formed by a block is
// just the content box. The containing block for absolutely-positioned descendants, // just the content box. The containing block for absolutely-positioned descendants,
// on the other hand, only established if we are positioned. // on the other hand, only established if we are positioned.
let container_block_size = fragment.content_box_size(); info.relative_containing_block_size = fragment.content_box_size();
if self.is_positioned() { if self.is_positioned() {
info.absolute_containing_block_position = self.base.abs_position + info.absolute_containing_block_position =
self.base.abs_position +
self.generated_cb_position() + self.generated_cb_position() +
fragment.relative_position(&container_block_size) fragment.relative_position(&info.relative_containing_block_size)
} }
} }

View file

@ -26,9 +26,9 @@ pub struct DisplayListBuilder<'a> {
/// Information needed at each step of the display list building traversal. /// Information needed at each step of the display list building traversal.
pub struct DisplayListBuildingInfo { pub struct DisplayListBuildingInfo {
/// The size of the containing block. /// The size of the containing block for relatively-positioned descendants.
containing_block_size: Size2D<Au>, relative_containing_block_size: Size2D<Au>,
/// The absolute position of the absolute containing block. /// The position and size of the absolute containing block.
absolute_containing_block_position: Point2D<Au>, absolute_containing_block_position: Point2D<Au>,
/// Whether the absolute containing block forces positioned descendants to be layerized. /// Whether the absolute containing block forces positioned descendants to be layerized.
layers_needed_for_positioned_flows: bool, layers_needed_for_positioned_flows: bool,

View file

@ -495,7 +495,7 @@ impl InlineFlow {
debug!("Flow: building display list for {:u} inline boxes", self.boxes.len()); debug!("Flow: building display list for {:u} inline boxes", self.boxes.len());
for box_ in self.boxes.iter() { for box_ in self.boxes.iter() {
let rel_offset: Point2D<Au> = box_.relative_position(&info.containing_block_size); let rel_offset = box_.relative_position(&info.relative_containing_block_size);
box_.build_display_list(stacking_context, box_.build_display_list(stacking_context,
builder, builder,
info, info,

View file

@ -634,7 +634,7 @@ impl LayoutTask {
dirty: flow::base(layout_root).position.clone(), dirty: flow::base(layout_root).position.clone(),
}; };
let display_list_building_info = DisplayListBuildingInfo { let display_list_building_info = DisplayListBuildingInfo {
containing_block_size: flow::base(layout_root).position.size, relative_containing_block_size: flow::base(layout_root).position.size,
absolute_containing_block_position: Point2D(Au(0), Au(0)), absolute_containing_block_position: Point2D(Au(0), Au(0)),
layers_needed_for_positioned_flows: false, layers_needed_for_positioned_flows: false,
}; };
@ -672,10 +672,10 @@ impl LayoutTask {
} }
} }
let root_size = Size2D(display_list_building_info.containing_block_size let root_size = Size2D(display_list_building_info.relative_containing_block_size
.width .width
.to_nearest_px() as uint, .to_nearest_px() as uint,
display_list_building_info.containing_block_size display_list_building_info.relative_containing_block_size
.height .height
.to_nearest_px() as uint); .to_nearest_px() as uint);
let render_layer = RenderLayer { let render_layer = RenderLayer {