aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2015-05-01 18:05:07 -0700
committerPatrick Walton <pcwalton@mimiga.net>2015-05-01 18:07:07 -0700
commit33087497ac7fc012830a237323391d13f4bb221e (patch)
treeb34a2c50ae28b702447501dc8be979b6d60c2599 /components/layout
parenta346f95e6861e33244307783b6de35892178e8ad (diff)
downloadservo-33087497ac7fc012830a237323391d13f4bb221e.tar.gz
servo-33087497ac7fc012830a237323391d13f4bb221e.zip
layout: Fix a couple of issues relating to intrinsic widths of inline
blocks. * 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.
Diffstat (limited to 'components/layout')
-rw-r--r--components/layout/block.rs19
-rw-r--r--components/layout/construct.rs2
-rw-r--r--components/layout/fragment.rs6
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()
}
}