aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2014-03-31 19:26:56 -0700
committerPatrick Walton <pcwalton@mimiga.net>2014-04-03 14:51:19 -0700
commitaabda89a905d22a729a19dd8d3241d02407a07b2 (patch)
tree6720c68cd17bad9cce4de6ee196a70ad9af1ef8e
parent2e5b210c95baa704c10152549a3ccf94d5d70663 (diff)
downloadservo-aabda89a905d22a729a19dd8d3241d02407a07b2.tar.gz
servo-aabda89a905d22a729a19dd8d3241d02407a07b2.zip
layout: Fix percentages in relatively positioned elements
-rw-r--r--src/components/main/layout/block.rs9
-rw-r--r--src/components/main/layout/display_list_builder.rs6
-rw-r--r--src/components/main/layout/inline.rs2
-rw-r--r--src/components/main/layout/layout_task.rs6
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 {