diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2014-03-31 19:26:56 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2014-04-03 14:51:19 -0700 |
commit | aabda89a905d22a729a19dd8d3241d02407a07b2 (patch) | |
tree | 6720c68cd17bad9cce4de6ee196a70ad9af1ef8e | |
parent | 2e5b210c95baa704c10152549a3ccf94d5d70663 (diff) | |
download | servo-aabda89a905d22a729a19dd8d3241d02407a07b2.tar.gz servo-aabda89a905d22a729a19dd8d3241d02407a07b2.zip |
layout: Fix percentages in relatively positioned elements
-rw-r--r-- | src/components/main/layout/block.rs | 9 | ||||
-rw-r--r-- | src/components/main/layout/display_list_builder.rs | 6 | ||||
-rw-r--r-- | src/components/main/layout/inline.rs | 2 | ||||
-rw-r--r-- | src/components/main/layout/layout_task.rs | 6 |
4 files changed, 12 insertions, 11 deletions
diff --git a/src/components/main/layout/block.rs b/src/components/main/layout/block.rs index 5a731fbd748..0ba75a4a53b 100644 --- a/src/components/main/layout/block.rs +++ b/src/components/main/layout/block.rs @@ -1171,7 +1171,7 @@ impl BlockFlow { let mut info = *info; let mut rel_offset = Point2D(Au(0), Au(0)); 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. fragment.build_display_list(stacking_context, @@ -1184,11 +1184,12 @@ impl BlockFlow { // For relatively-positioned descendants, the containing block formed by a block is // just the content box. The containing block for absolutely-positioned descendants, // 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() { - info.absolute_containing_block_position = self.base.abs_position + + info.absolute_containing_block_position = + self.base.abs_position + self.generated_cb_position() + - fragment.relative_position(&container_block_size) + fragment.relative_position(&info.relative_containing_block_size) } } diff --git a/src/components/main/layout/display_list_builder.rs b/src/components/main/layout/display_list_builder.rs index 4779c913fc4..3bec56473c3 100644 --- a/src/components/main/layout/display_list_builder.rs +++ b/src/components/main/layout/display_list_builder.rs @@ -26,9 +26,9 @@ pub struct DisplayListBuilder<'a> { /// Information needed at each step of the display list building traversal. pub struct DisplayListBuildingInfo { - /// The size of the containing block. - containing_block_size: Size2D<Au>, - /// The absolute position of the absolute containing block. + /// The size of the containing block for relatively-positioned descendants. + relative_containing_block_size: Size2D<Au>, + /// The position and size of the absolute containing block. absolute_containing_block_position: Point2D<Au>, /// Whether the absolute containing block forces positioned descendants to be layerized. layers_needed_for_positioned_flows: bool, diff --git a/src/components/main/layout/inline.rs b/src/components/main/layout/inline.rs index e162a270651..4c3e10fc265 100644 --- a/src/components/main/layout/inline.rs +++ b/src/components/main/layout/inline.rs @@ -495,7 +495,7 @@ impl InlineFlow { debug!("Flow: building display list for {:u} inline boxes", self.boxes.len()); 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, builder, info, diff --git a/src/components/main/layout/layout_task.rs b/src/components/main/layout/layout_task.rs index 1e338bd7e1c..267da50e62b 100644 --- a/src/components/main/layout/layout_task.rs +++ b/src/components/main/layout/layout_task.rs @@ -634,7 +634,7 @@ impl LayoutTask { dirty: flow::base(layout_root).position.clone(), }; 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)), 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 .to_nearest_px() as uint, - display_list_building_info.containing_block_size + display_list_building_info.relative_containing_block_size .height .to_nearest_px() as uint); let render_layer = RenderLayer { |