Do not compound iframe margins when positioning

Instead of taking margin size into account twice when positioning
layers, just rely on the absolute position calculated during display
list construction.
This commit is contained in:
Martin Robinson 2014-10-13 17:22:33 -07:00
parent 6e3c776387
commit e53093e127
4 changed files with 23 additions and 12 deletions

View file

@ -1236,7 +1236,7 @@ impl Fragment {
match self.specific { match self.specific {
IframeFragment(ref iframe_fragment) => { IframeFragment(ref iframe_fragment) => {
self.finalize_position_and_size_of_iframe(iframe_fragment, self.finalize_position_and_size_of_iframe(iframe_fragment,
flow_origin, absolute_fragment_bounds.origin,
layout_context) layout_context)
} }
_ => {} _ => {}
@ -1741,23 +1741,20 @@ impl Fragment {
iframe_fragment: &IframeFragmentInfo, iframe_fragment: &IframeFragmentInfo,
offset: Point2D<Au>, offset: Point2D<Au>,
layout_context: &LayoutContext) { layout_context: &LayoutContext) {
let mbp = (self.margin + self.border_padding).to_physical(self.style.writing_mode); let border_padding = (self.border_padding).to_physical(self.style.writing_mode);
let content_size = self.content_box().size.to_physical(self.style.writing_mode); let content_size = self.content_box().size.to_physical(self.style.writing_mode);
let iframe_rect = Rect(Point2D(geometry::to_frac_px(offset.x + border_padding.left) as f32,
let left = offset.x + mbp.left; geometry::to_frac_px(offset.y + border_padding.top) as f32),
let top = offset.y + mbp.top; Size2D(geometry::to_frac_px(content_size.width) as f32,
let width = content_size.width; geometry::to_frac_px(content_size.height) as f32));
let height = content_size.height;
let origin = Point2D(geometry::to_frac_px(left) as f32, geometry::to_frac_px(top) as f32);
let size = Size2D(geometry::to_frac_px(width) as f32, geometry::to_frac_px(height) as f32);
let rect = Rect(origin, size);
debug!("finalizing position and size of iframe for {:?},{:?}", debug!("finalizing position and size of iframe for {:?},{:?}",
iframe_fragment.pipeline_id, iframe_fragment.pipeline_id,
iframe_fragment.subpage_id); iframe_fragment.subpage_id);
let msg = FrameRectMsg(iframe_fragment.pipeline_id, iframe_fragment.subpage_id, rect);
let ConstellationChan(ref chan) = layout_context.shared.constellation_chan; let ConstellationChan(ref chan) = layout_context.shared.constellation_chan;
chan.send(msg) chan.send(FrameRectMsg(iframe_fragment.pipeline_id,
iframe_fragment.subpage_id,
iframe_rect));
} }
/// Returns true if and only if this is the *primary fragment* for the fragment's style object /// Returns true if and only if this is the *primary fragment* for the fragment's style object

View file

@ -127,6 +127,7 @@ fragment=top != ../html/acid2.html acid2_ref.html
== iframe/simple.html iframe/simple_ref.html == iframe/simple.html iframe/simple_ref.html
== iframe/multiple_external.html iframe/multiple_external_ref.html == iframe/multiple_external.html iframe/multiple_external_ref.html
== iframe/overflow.html iframe/overflow_ref.html == iframe/overflow.html iframe/overflow_ref.html
== iframe/positioning_margin.html iframe/positioning_margin_ref.html
== floated_generated_content_a.html floated_generated_content_b.html == floated_generated_content_a.html floated_generated_content_b.html
== inline_block_margin_a.html inline_block_margin_ref.html == inline_block_margin_a.html inline_block_margin_ref.html

View file

@ -0,0 +1,8 @@
<html>
<body style="margin: 0px;">
<iframe src="data:text/html,%3Chtml%3E%3Cbody%20style%3D%22margin%3A%200px%3B%22%3E%3Cdiv%20style%3D%22background%3A%20green%3B%20height%3A%20100px%3B%20width%3A%20100px%3B%22%3E%3C%2Fdiv%3E%3C%2Fbody%3E%3C%2Fhtml%3E"
style="display: block; border: 0px; width: 100px; height: 100px; margin-top: 100px;">
</iframe>
</body>
</html>

View file

@ -0,0 +1,5 @@
<html>
<body>
<div style="position: absolute; width: 100px; height: 100px; background: green; top: 100px; left: 0px;"></div>
</body>
</html>