diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-09-04 19:59:11 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-09-04 19:59:11 -0600 |
commit | aeb8dce2d914808e4cdb8589d19ee9968897ed94 (patch) | |
tree | bc5858527d9c106b662371c1da914e0d4806ee72 | |
parent | 5bad6b1b6e149246e8949fd42059e777d1cbd9e3 (diff) | |
parent | dba3e41a63506842e84e43451d6f41156c672321 (diff) | |
download | servo-aeb8dce2d914808e4cdb8589d19ee9968897ed94.tar.gz servo-aeb8dce2d914808e4cdb8589d19ee9968897ed94.zip |
Auto merge of #7534 - pcwalton:inline-absolute-out-of-flow, r=mbrubeck
layout: Lay absolutely-positioned blocks with inline containing blocks out of flow.
Removes the long space before the site-specific drop-down in the Google SERPs.
r? @glennw
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/7534)
<!-- Reviewable:end -->
-rw-r--r-- | components/layout/fragment.rs | 7 | ||||
-rw-r--r-- | components/layout/inline.rs | 25 | ||||
-rw-r--r-- | tests/ref/basic.list | 1 | ||||
-rw-r--r-- | tests/ref/inline_absolute_out_of_flow_a.html | 13 | ||||
-rw-r--r-- | tests/ref/inline_absolute_out_of_flow_ref.html | 3 |
5 files changed, 40 insertions, 9 deletions
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index fd31eb1074f..b6c5e00a4e8 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -2376,6 +2376,13 @@ impl Fragment { self.style.get_box().position == position::T::absolute } + pub fn is_inline_absolute(&self) -> bool { + match self.specific { + SpecificFragmentInfo::InlineAbsolute(..) => true, + _ => false, + } + } + pub fn meld_with_next_inline_fragment(&mut self, next_fragment: &Fragment) { if let Some(ref mut inline_context_of_this_fragment) = self.inline_context { if let Some(ref inline_context_of_next_fragment) = next_fragment.inline_context { diff --git a/components/layout/inline.rs b/components/layout/inline.rs index 22fe3054b63..5b137ceade2 100644 --- a/components/layout/inline.rs +++ b/components/layout/inline.rs @@ -738,13 +738,17 @@ impl LineBreaker { layout_context: &LayoutContext) { let indentation = self.indentation_for_pending_fragment(); self.pending_line.range.extend_by(FragmentIndex(1)); - self.pending_line.bounds.size.inline = self.pending_line.bounds.size.inline + - fragment.margin_box_inline_size() + - indentation; - self.pending_line.inline_metrics = - self.new_inline_metrics_for_line(&fragment, layout_context); - self.pending_line.bounds.size.block = - self.new_block_size_for_line(&fragment, layout_context); + + if !fragment.is_inline_absolute() { + self.pending_line.bounds.size.inline = self.pending_line.bounds.size.inline + + fragment.margin_box_inline_size() + + indentation; + self.pending_line.inline_metrics = + self.new_inline_metrics_for_line(&fragment, layout_context); + self.pending_line.bounds.size.block = + self.new_block_size_for_line(&fragment, layout_context); + } + self.new_fragments.push(fragment); } @@ -1079,8 +1083,11 @@ impl InlineFlow { fragment.border_box.size.inline, fragment.border_box.size.block); fragment.update_late_computed_inline_position_if_necessary(); - inline_start_position_for_fragment = inline_start_position_for_fragment + - fragment.border_box.size.inline + fragment.margin.inline_end; + + if !fragment.is_inline_absolute() { + inline_start_position_for_fragment = inline_start_position_for_fragment + + fragment.border_box.size.inline + fragment.margin.inline_end; + } } } } diff --git a/tests/ref/basic.list b/tests/ref/basic.list index 41de5fd7b3e..6d6cf789c31 100644 --- a/tests/ref/basic.list +++ b/tests/ref/basic.list @@ -160,6 +160,7 @@ prefs:"layout.writing-mode.enabled" == iframe/size_attributes_vertical_writing_m == incremental_float_a.html incremental_float_ref.html == incremental_inline_layout_a.html incremental_inline_layout_ref.html == inline_absolute_hypothetical_clip_a.html inline_absolute_hypothetical_clip_ref.html +== inline_absolute_out_of_flow_a.html inline_absolute_out_of_flow_ref.html != inline_background_a.html inline_background_ref.html == inline_block_baseline_a.html inline_block_baseline_ref.html == inline_block_block_direction_margins_a.html inline_block_block_direction_margins_ref.html diff --git a/tests/ref/inline_absolute_out_of_flow_a.html b/tests/ref/inline_absolute_out_of_flow_a.html new file mode 100644 index 00000000000..b16d5754fb1 --- /dev/null +++ b/tests/ref/inline_absolute_out_of_flow_a.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<style> +#a { + display: inline; + position: relative; +} +#b { + position: absolute; + display: block; +} +</style> +<div>A<span id=a><div id=b> </div></span>B</div> + diff --git a/tests/ref/inline_absolute_out_of_flow_ref.html b/tests/ref/inline_absolute_out_of_flow_ref.html new file mode 100644 index 00000000000..2fba510f579 --- /dev/null +++ b/tests/ref/inline_absolute_out_of_flow_ref.html @@ -0,0 +1,3 @@ +<!DOCTYPE html> +<div>AB</div> + |