diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-05-04 13:37:24 -0500 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-05-04 13:37:24 -0500 |
commit | 7b87085c1880c60aa3be5b3ec4572a0d93fd5537 (patch) | |
tree | ca5da0b5d6e59d24357a94999206d07ca3fedc0c /components/layout | |
parent | 89f90d930d172366d72fdd9f3363c80a5a56f552 (diff) | |
parent | 33087497ac7fc012830a237323391d13f4bb221e (diff) | |
download | servo-7b87085c1880c60aa3be5b3ec4572a0d93fd5537.tar.gz servo-7b87085c1880c60aa3be5b3ec4572a0d93fd5537.zip |
Auto merge of #5919 - pcwalton:inline-block-intrinsic-widths, r=mbrubeck
* Stop double-counting border and padding for inline-block fragments.
(Test case: `inline_block_border_intrinsic_size_a.html`.)
* Take clearance into account when determining intrinsic widths of
blocks containing floats.
Improves the Amazon headers.
r? @mbrubeck
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/5919)
<!-- Reviewable:end -->
Diffstat (limited to 'components/layout')
-rw-r--r-- | components/layout/block.rs | 19 | ||||
-rw-r--r-- | components/layout/construct.rs | 2 | ||||
-rw-r--r-- | components/layout/fragment.rs | 6 |
3 files changed, 19 insertions, 8 deletions
diff --git a/components/layout/block.rs b/components/layout/block.rs index e61ad3104c8..b01a31804b2 100644 --- a/components/layout/block.rs +++ b/components/layout/block.rs @@ -1465,8 +1465,8 @@ impl Flow for BlockFlow { // Find the maximum inline-size from children. let mut computation = self.fragment.compute_intrinsic_inline_sizes(); - let mut left_float_width = Au(0); - let mut right_float_width = Au(0); + let (mut left_float_width, mut right_float_width) = (Au(0), Au(0)); + let (mut left_float_width_accumulator, mut right_float_width_accumulator) = (Au(0), Au(0)); for kid in self.base.child_iter() { let is_absolutely_positioned = flow::base(kid).flags.contains(IS_ABSOLUTELY_POSITIONED); @@ -1477,6 +1477,15 @@ impl Flow for BlockFlow { max(computation.content_intrinsic_sizes.minimum_inline_size, child_base.intrinsic_inline_sizes.minimum_inline_size); + if child_base.flags.contains(CLEARS_LEFT) { + left_float_width = Au::max(left_float_width, left_float_width_accumulator); + left_float_width_accumulator = Au(0) + } + if child_base.flags.contains(CLEARS_RIGHT) { + right_float_width = Au::max(right_float_width, right_float_width_accumulator); + right_float_width_accumulator = Au(0) + } + match float_kind { float::T::none => { computation.content_intrinsic_sizes.preferred_inline_size = @@ -1484,11 +1493,11 @@ impl Flow for BlockFlow { child_base.intrinsic_inline_sizes.preferred_inline_size); } float::T::left => { - left_float_width = left_float_width + + left_float_width_accumulator = left_float_width_accumulator + child_base.intrinsic_inline_sizes.preferred_inline_size; } float::T::right => { - right_float_width = right_float_width + + right_float_width_accumulator = right_float_width_accumulator + child_base.intrinsic_inline_sizes.preferred_inline_size; } } @@ -1500,6 +1509,8 @@ impl Flow for BlockFlow { // FIXME(pcwalton): This should consider all float descendants, not just children. // FIXME(pcwalton): This is not well-spec'd; INTRINSIC specifies to do this, but CSS-SIZING // says not to. In practice, Gecko and WebKit both do this. + left_float_width = Au::max(left_float_width, left_float_width_accumulator); + right_float_width = Au::max(right_float_width, right_float_width_accumulator); computation.content_intrinsic_sizes.preferred_inline_size = max(computation.content_intrinsic_sizes.preferred_inline_size, left_float_width + right_float_width); diff --git a/components/layout/construct.rs b/components/layout/construct.rs index c72de1d122a..c0480e8562c 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -822,7 +822,7 @@ impl<'a> FlowConstructor<'a> { block_flow)); let fragment = Fragment::new(node, fragment_info); - let mut fragment_accumulator = InlineFragmentsAccumulator::from_inline_node(node); + let mut fragment_accumulator = InlineFragmentsAccumulator::new(); fragment_accumulator.fragments.push_back(fragment); let construction_item = diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 8b60b4cfc72..7ad0e8895ad 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -882,8 +882,7 @@ impl Fragment { SpecificFragmentInfo::Generic | SpecificFragmentInfo::GeneratedContent(_) | SpecificFragmentInfo::Iframe(_) | - SpecificFragmentInfo::Image(_) | - SpecificFragmentInfo::InlineBlock(_) => { + SpecificFragmentInfo::Image(_) => { QuantitiesIncludedInIntrinsicInlineSizes::all() } SpecificFragmentInfo::Table | SpecificFragmentInfo::TableCell => { @@ -918,7 +917,8 @@ impl Fragment { SpecificFragmentInfo::ScannedText(_) | SpecificFragmentInfo::TableColumn(_) | SpecificFragmentInfo::UnscannedText(_) | - SpecificFragmentInfo::InlineAbsoluteHypothetical(_) => { + SpecificFragmentInfo::InlineAbsoluteHypothetical(_) | + SpecificFragmentInfo::InlineBlock(_) => { QuantitiesIncludedInIntrinsicInlineSizes::empty() } } |